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

 

 

 

posted @ 2013-08-02 16:50  _随心所欲_  阅读(222)  评论(0编辑  收藏  举报