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

 

 

 

你可能感兴趣的:(set)