zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    js实现考试倒计时
    freemarker常见语法大全
    页面修改图片路径
    freemaker页面字符串特殊字符显示异常处理
    win10家庭版远程连接 要求的函数不受支持
    mysql出现提示错误10061的解决方法
    freemark
    面对众多的前端框架,你该如何学习?
    HBase 入门
    Hive 优化
  • 原文地址:https://www.cnblogs.com/xin-hua/p/3233050.html
Copyright © 2011-2022 走看看