高斯消元

来源:互联网 发布:苹果cms和海洋cms 编辑:程序博客网 时间:2024/06/03 09:38
#include<stdio.h>#include<algorithm>#include<iostream>#include<string.h>#include<math.h>using namespace std;int a[72][72],x[72],r,c,mod;int gcd(int a,int b){    return b?gcd(b,a%b):a;}int lcm(int a,int b){    return a/gcd(a,b)*b;}int pow_mod(int a,int b){    int res=1;    while(b)    {        if(b&1) res=res*a%mod;        a=a*a%mod;        b>>=1;    }    return res;}void Gauss(){    int k,col,max_r,i,j,LCM,ta,tb,temp;    for(k=col=0;k<r&&col<c;col++)  //枚举行,列从0开始    {        max_r=k;        for(i=k+1;i<r;i++)            if(abs(a[i][col])>abs(a[max_r][col])) max_r=i;   //找到这一列里面绝对值最大的        if(!a[max_r][col]) continue;   //最大的都是0,那么这一列不用考虑了        if(max_r!=k)            for(i=col;i<=c;i++) swap(a[max_r][i],a[k][i]);  //否则交换        for(i=k+1;i<r;i++)            if(a[i][col]!=0)            {                LCM=lcm(abs(a[i][col]),abs(a[k][col]));                ta=LCM/abs(a[i][col]);                tb=LCM/abs(a[k][col]);                if(a[i][col]*a[k][col]<0) tb=-tb;                for(j=col;j<=c;j++) a[i][j]=((a[i][j]*ta%mod-a[k][j]*tb%mod)+mod)%mod;            }        k++;    }    //for(i=k;i<r;i++) if(a[i][col]) return -1;    for(i=c-1;i>=0;i--)    {        temp=a[i][col];        for(j=i+1;j<c;j++)            if(a[i][j]!=0) temp=((temp-a[i][j]*x[j]%mod)+mod)%mod;        x[i]=temp*pow_mod(a[i][i],mod-2)%mod;    }}int main(){    int i,j,t,v;    scanf("%d",&t);    char s[72];    while(t--)    {        memset(a,0,sizeof(a));        scanf("%d%s",&mod,s);        r=c=strlen(s);        for(i=0;i<r;i++) a[i][c]=(s[i]=='*'?0:s[i]-96);        for(i=0;i<r;i++)        {            v=a[i][0]=1;            for(j=1;j<c;j++)            {                v=v*(i+1)%mod;                a[i][j]=v;            }        }        Gauss();        for(i=0;i<r;i++)            printf("%d%c",x[i],i+1==r?'\n':' ');    }}// 模2时的高斯消元#include<stdio.h>#include<algorithm>#include<iostream>#include<string.h>using namespace std;int a[35][35],b[35],r,c,mod=2;int Gauss(){    int k,col,max_r,i,j;    for(k=col=0;k<r&&col<c;col++)  //枚举行,列从0开始    {        max_r=k;        for(i=k+1;i<r;i++)            if(abs(a[i][col])>abs(a[max_r][col]) )max_r=i;   //找到这一列里面绝对值最大的        if(!a[max_r][col]) continue;   //最大的都是0,那么这一列不用考虑了        if(max_r!=k)            for(i=col;i<=c;i++) swap(a[max_r][i],a[k][i]);  //否则交换        for(i=k+1;i<r;i++)            if(a[i][col]!=0)                for(j=col;j<=c;j++) a[i][j]^=a[k][j];        k++;    }    for(i=k;i<r;i++)        if(a[i][col]) return 0;    if(k<c) return 1<<(c-k);    return 1;}int main(){    int i,t,v,u;    scanf("%d",&t);    while(t--)    {        memset(a,0,sizeof(a));        scanf("%d",&r);  c=r;        for(i=0;i<r;i++) scanf("%d",&b[i]);        for(i=0;i<r;i++)        {            scanf("%d",&v);            a[i][c]=b[i]^v;            a[i][i]=1;        }        while(scanf("%d%d",&u,&v)&&u) a[v-1][u-1]=1;        v=Gauss();        if(v) printf("%d\n",v);        else printf("Oh,it's impossible~!!\n");    }}

0 0
原创粉丝点击