poj 2065

#include<iostream>
#include<fstream>
#include<cmath>

using namespace std;

int n,m,p;

int map[74][74];

int find(int s,int t){
    s=(s%p+p)%p;
    t=(t%p+p)%p;
    for(int i=0;i<p;i++)
        if((i*t)%p==s)
            return i;
}

void solve(){
    int i,j,k,s,t,a,b;
    j=0;
    for(i=0;i<n&&j<m;i++,j++)
    {
        s=0;t=0;
        for(k=i;k<n;k++)
            if(s<abs(map[k][j]))
            {
                s=abs(map[k][j]);
                t=k;
            }
        if(s==0)
        {
            i--;
            continue;
        }

        if(t!=i)
            for(k=j;k<=m;k++)
                swap(map[t][k],map[i][k]);
        a=map[i][j];
       
        for(k=i+1;k<n;k++)

        {
            b=map[k][j];
            if(b!=0)
            {
                for(s=j;s<=m;s++)
                    map[k][s]=(map[k][s]*a-map[i][s]*b)%p;
                   
            }
        }
    }
    for(i=n-1;i>=0;i--)
    {
        k=0;
        for(j=i+1;j<m;j++)
            k=(k+map[i][j]*map[j][m])%p;
        map[i][m]=find(map[i][m]-k,map[i][i]);   
    }
    for(i=0;i<n;i++)
        cout<<map[i][n]<<' ';
    cout<<endl;

}


void read(){
//    ifstream cin("in.txt");
    int i,j,k;
    int cas;
    cin>>cas;
    char c[100];

    while(cas--)
    {
        cin>>p>>c;
        m=n=strlen(c);
        memset(map,0,sizeof(map));
        for(i=0;i<n;i++)
        {
            if(c[i]!='*')
                map[i][n]=(c[i]-'a'+1)%p;
            else
                map[i][n]=0;
        }
        for(i=0;i<n;i++)
        {
            k=1;
            for(j=0;j<n;j++)
            {
                map[i][j]=k;
                k=(k*(i+1))%p;
            }
        }

        solve();
    }
}

int main(){
    read();
    return 0;
}

posted on 2011-06-02 11:06  宇宙吾心  阅读(239)  评论(0编辑  收藏  举报

导航