PS:今天上午,非常郁闷,有很多简单基础的问题搞得我有些迷茫,哎,代码几天不写就忘。目前又不当COO,还是得用心记代码哦!
本题是CMO(数学 Olympics) 2012 第二题
所以还是很坑的……(出题人是shuxuedi)
反正这题总算是写了一个远远长于正解的打表(Gauss消元-判断有无整数解/无解,已肯定谜底是不是可行)
#include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<functional> #include<iostream> #include<cmath> #include<cctype> #include<ctime> using namespace std; #define For(i,n) for(int i=1;i<=n;i++) #define Fork(i,k,n) for(int i=k;i<=n;i++) #define Rep(i,n) for(int i=0;i<n;i++) #define ForD(i,n) for(int i=n;i;i--) #define RepD(i,n) for(int i=n;i>=0;i--) #define Forp(x) for(int p=pre[x];p;p=next[p]) #define Lson (x<<1) #define Rson ((x<<1)+1) #define MEM(a) memset(a,0,sizeof(a)); #define MEMI(a) memset(a,127,sizeof(a)); #define MEMi(a) memset(a,128,sizeof(a)); #define INF (2139062143) #define F (100000007) #define MAXN (10) long long mul(long long a,long long b){return (a*b)%F;} long long add(long long a,long long b){return (a+b)%F;} long long sub(long long a,long long b){return (a-b+(a-b)/F*F+F)%F;} long long gcd(long long a,long long b){if (!b) return a;return gcd(b,a%b);} long long lcm(long long a,long long b){return a/gcd(a,b)*b;} int n,a[10][10],b[100]={0}; int f[100+10][100+10]={0},un_fre[2*MAXN]={0}; int f2[100+10][100+10]={0}; void print() { For(i,2*n) { For(j,2*n+1) cout<<f2[i][j]<<' '; cout<<endl; } cout<<endl; } int gauss(int N) { memcpy(f2,f,sizeof(f)); //print(); memset(un_fre,0,sizeof(un_fre)); int k=1; For(i,2*n) { int t=0; Fork(j,k,N) if (f2[j][i]) t=j; if (!t) continue;//cout<<t<<' '<<i<<' '<<f[t][i]<<' '<<k<<endl; //print(); swap(f2[k],f2[t]); //print(); Fork(j,1,N) { if (j^k&&f2[j][i]) { int _l=lcm(abs(f2[j][i]),abs(f2[k][i])); int ta=_l/f2[k][i],tb=_l/f2[j][i]; Fork(l,1,2*n+1) f2[j][l]=f2[k][l]*ta-f2[j][l]*tb; } } un_fre[k]=i; k++; }k--; /* For(i,k) { if (f[i][2*n+1]%f[i][un_fre[i]]) return 2; else f[i][2*n+1]/=f[i][un_fre[i]]; //if (f[i][2*n+1]<0) return -1; }*/ //cout<<k<<endl; Fork(i,k+1,N) { if (f2[i][2*n+1]) return 0; } //print(); /* For(i,k) { cout<<un_fre[i]<<':'<<f2[i][2*n+1]<<' '; }cout<<endl;*/ //print(); //system("pause"); return 1; } int tot=0; void dfs(int i,int j) { if (j>n) i++,j=1; if (i==n+1) { tot++; For(i,n) { For(j,n) cout<<a[i][j]<<' '; cout<<endl; } cout<<endl; } For(p,n*n) if (!b[p]) { b[p]=1; a[i][j]=p; //memset(f[(i-1)*n+j],0,sizeof(f[(i-1)*n+j])); f[(i-1)*n+j][i]=f[(i-1)*n+j][n+j]=1;f[(i-1)*n+j][2*n+1]=p; if ((i-1)*n+j==n*n) if (gauss((i-1)*n+j)^1) {b[p]=0;continue;} dfs(i,j+1); b[p]=0; } } int main() { // freopen("repay.in","r",stdin); // freopen(".out","w",stdout); cin>>n; dfs(1,1); cout<<tot<<endl; return 0; }
好吧……到4已经打不出表了……
观察后发明:
每一个矩阵满意如下性质
每行or 每列 数字集合一定是kp+1,kp+2...kp+p 型
1 2 3 4 7 1
4 5 6 or 5 8 2
7 8 9 6 3 9
行和列可以互换(必须整行整列)
于是谜底就是2(行/列)*(p!)第一行排列顺序(p!)行的排列顺序
这题尽管n很大,但是过了10007以后就都是0了
#include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<functional> #include<iostream> #include<cmath> #include<cctype> #include<ctime> using namespace std; #define For(i,n) for(int i=1;i<=n;i++) #define Fork(i,k,n) for(int i=k;i<=n;i++) #define Rep(i,n) for(int i=0;i<n;i++) #define ForD(i,n) for(int i=n;i;i--) #define RepD(i,n) for(int i=n;i>=0;i--) #define Forp(x) for(int p=pre[x];p;p=next[p]) #define Lson (x<<1) #define Rson ((x<<1)+1) #define MEM(a) memset(a,0,sizeof(a)); #define MEMI(a) memset(a,127,sizeof(a)); #define MEMi(a) memset(a,128,sizeof(a)); #define INF (2139062143) #define F (10007) long long mul(long long a,long long b){return (a*b)%F;} long long add(long long a,long long b){return (a+b)%F;} long long sub(long long a,long long b){return (a-b+(a-b)/F*F+F)%F;} long long n; int main() { freopen("repay.in","r",stdin); freopen("repay.out","w",stdout); cin>>n; long long ans=2; For(i,n) { if (ans==0) break; ans=mul(ans,i);ans=mul(ans,i); } cout<<ans<<endl; return 0; }
文章结束给大家分享下程序员的一些笑话语录: 面试官:熟悉哪种语言
应聘者:JAVA
面试官:知道什么叫类么
应聘者:我这人实在,工作努力,不知道什么叫累
面试官:知道什么是包?
应聘者:我这人实在 平常不带包 也不用公司准备了
面试官:知道什么是接口吗?
应聘者:我这个人工作认真。从来不找借口偷懒
面试官:知道什么是继承么
应聘者:我是孤儿没什么可以继承的
面试官:知道什么叫对象么?
应聘者:知道,不过我工作努力,上进心强,暂时还没有打算找对象。
面试官:知道多态么?
应聘者:知道,我很保守的。我认为让心爱的女人为了自已一时的快乐去堕胎是不道德的行为!请问这和C#有什么关系??
---------------------------------
原创文章 By
整数和矩阵
---------------------------------