不知道为什么消元的时候没选择绝对值最大的那一列就不会wa了
可能是刚好避开了数据吧觉得
可能刚好选择到每个a(i,i)=1 ,a(i,i)=3 (即a(i,i)=2 时就会出错)的那一行
已知p是素数时,模p剩余系里每个除0以外的元素都有唯一的逆。
模4时,由于4不是素数,所以不会有唯一的逆,比如2就没有逆
当在消元化简到 ax=b(mod 4) 我们枚举x=0,1,2,3可能都没有解
这是因为线性模方程 ax=b(mod n) -> ax-ny=b , d=(a,n) , 当 b%d!=0 时是没有解的
而当n是素数,d=(a,n)=1,b%d=0,肯定有解
事先算好这个矩阵的逆(在模4时同样可能出错)后直接乘得到结果觉得应该也可以过
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <map> #include <set> #include <algorithm> #include <ctime> #include <vector> #include <string> using namespace std; int a[9][10]={ {1,1,0,1,0,0,0,0,0,0}, {1,1,1,0,1,0,0,0,0,0}, {0,1,1,0,0,1,0,0,0,0}, {1,0,0,1,1,0,1,0,0,0}, {1,0,1,0,1,0,1,0,1,0}, {0,0,1,0,1,1,0,0,1,0}, {0,0,0,1,0,0,1,1,0,0}, {0,0,0,0,1,0,1,1,1,0}, {0,0,0,0,0,1,0,1,1,0} }; int p=4; int ans[100]; int gcd(int a,int b) { return b==0 ? a: gcd(b,a%b); } int lcm(int a,int b) { return a/gcd(a,b)*b; } int main () { for(int i=0;i<9;++i) { scanf("%d",&a[i][9]); a[i][9]=(4-a[i][9])%4; } int mul,ma,mb; for(int i=0;i<9;++i) { if(a[i][i]==0) { for(int k=i+1;k<9;++k) if(a[k][i]) { for(int j=0;j<=9;++j) swap(a[k][j],a[i][j]); break; } } for(int k=i+1;k<9;++k) if(a[k][i]) { ma=a[k][i]; mb=a[i][i]; for(int j=i;j<=9;++j) { a[k][j]=a[k][j]*mb-a[i][j]*ma; a[k][j]=(a[k][j]%4+4)%4; } } } int sum=0; for(int i=8;i>=0;--i) { for(int k=i+1;k<9;++k) { a[i][9]-=ans[k]*a[i][k]; a[i][9]=(a[i][9]%4+4)%4; } for(ans[i]=0;ans[i]<=3;ans[i]++) { if((a[i][i]*ans[i]%4+4)%4==a[i][9]) break; } ans[i]%=4; sum+=ans[i]; } int j=0,cnt=0;; while(j<9) { if(ans[j]) { printf("%d",j+1); cnt++; if(cnt<sum) printf(" "); else printf("\n"); ans[j]--; } else j++; } return 0; }