poj 2065 SETI 高斯消元
看题就知道要使用高斯消元求解!
代码如下:
#include<iostream> #include<algorithm> #include<iomanip> #include<cmath> #include<cstring> using namespace std; int an[70][71],p,ans[70]; char str[71]; int pows(int a,int b) { int ans=1; while(b){ if(b&1) ans=(ans*a)%p; b>>=1; a=(a*a)%p; } return ans%p; } int gcd(int a,int b) { if(a<b) swap(a,b); while(b){ int t=a; a=b; b=t%b; } return a; } int lcm(int a,int b) { return a/gcd(a,b)*b; } void show(int n) { for(int i=0;i<n;i++){ for(int j=0;j<=n;j++) cout<<an[i][j]<<' '; cout<<endl; } cout<<endl; } void Gauss(int n) { int i,j,k,ma,mb,LCM; for(i=0;i<n;i++){ int row=i; for(j=i+1;j<n;j++) if(an[j][i]>an[row][i]) row=j; if(row!=i){ for(j=0;j<=n;j++) swap(an[i][j],an[row][j]); } for(j=i+1;j<n;j++){ if(an[j][i]){ LCM=lcm(an[i][i],an[j][i]); ma=LCM/an[i][i]; mb=LCM/an[j][i]; for(k=i;k<=n;k++){ an[j][k]=mb*an[j][k]-ma*an[i][k]; an[j][k]=(an[j][k]%p+p)%p; } } } } for(i=n-1;i>=0;i--){ for(j=i+1;j<n;j++){ an[i][n]-=ans[j]*an[i][j]; an[i][n]=an[i][n]%p; } while(an[i][n]%an[i][i]) an[i][n]+=p; ans[i]=an[i][n]/an[i][i]; ans[i]=(ans[i]%p+p)%p; } } int main() { int t,len,i,j,k; cin>>t; while(t--){ cin>>p>>str; len=strlen(str); for(i=0;i<len;i++){ for(j=0;j<len;j++){ an[i][j]=pows(i+1,j); } if(str[i]=='*') an[i][len]=0; else an[i][len]=str[i]-'a'+1; } Gauss(len); for(i=0;i<len-1;i++) cout<<ans[i]<<' '; cout<<ans[i]<<endl; } }