SPOJ-Matrices with XOR property,暴力打表!

    xiaoxiao2021-03-25  106

                                             Matrices with XOR property

       应该先去看看这题的,补题的时候发现这题其实挺简单的。。

       题意:n*m的格子用1-n*m的数去填,要求如果一个格子(i1,j1)与另外一个格子(i2,j2)满足(i1^j1)>(i2^j2),则a[i1][j1]>a[i2][j2]。问有多少种方法。

      思路:n和m都在1000以内,我们可以预处理所有的格子的异或值。我们发现只有异或值大小不同的格子上的数有大小要求,而如果异或值相同的格子他们的大小关系是任意的,所以我们把所有异或值相同的数目求出来然后乘以其阶乘即可。

    //#pragma comment(linker, "/STACK:102400000,102400000") #include <map> #include <set> #include <queue> #include <stack> #include <cmath> #include <vector> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include<functional> #include<bits/stdc++.h> using namespace std; typedef long long ll; #define pd(x) printf("%d\n",x) #define plld(x) printf("%lld\n",x) #define pI64d(x) printf("%I64d\n",x) const int INF=1e9; const int MOD=1e9+7; const double eps=1e-7; const int N=1e3+5; int n,m,num[N][N],cnt[N*3]; void init() { memset(cnt,0,sizeof(cnt)); for(int i=1; i<N; i++) for(int j=1; j<N; j++) num[i][j]=i^j; } int main() { int t; scanf("%d",&t); init(); while(t--) { scanf("%d%d",&n,&m); memset(cnt,0,sizeof(cnt)); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) cnt[num[i][j]]++; ll ans=1; for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) { ans=ans*cnt[num[i][j]]%MOD; cnt[num[i][j]]--; } printf("%I64d\n",ans); } return 0; }

    
    转载请注明原文地址: https://ju.6miu.com/read-13421.html

    最新回复(0)