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

来源:互联网 发布:java Point类怎么用 编辑:程序博客网 时间:2024/05/17 20:28

                                         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;}



0 0
原创粉丝点击