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
  • 相关阅读:
    WebStorm 使用
    Mac上因磁盘格式导致gulp无限刷新问题
    JS数组随机排序
    Javascript高性能动画与页面渲染
    两列布局,左边固定,右边自适应的三种方法
    google pay app权限使用说明
    javaFX
    https网站引用http路径的js和css失效解决办法
    tomcat笔记
    java sigar.jar
  • 原文地址:https://www.cnblogs.com/xin-hua/p/3233050.html
Copyright © 2011-2022 走看看