高斯消元
来源:互联网 发布:苹果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
- 高斯消元
- 高斯消元
- 高斯消元
- 高斯消元
- 高斯消元
- 高斯消元
- 高斯消元
- ##高斯消元##
- 高斯消元
- 高斯消元
- 高斯消元
- 高斯消元
- 高斯消元
- 高斯消元
- 高斯消元
- 高斯消元
- 高斯消元
- 高斯消元
- C/C++ 代码安全(三)
- Oracle查询语句(二)
- float属性理解
- Java中equals和==的区别
- spring security下fileupload上传文件被拦截
- 高斯消元
- 前端新玩具——webGL简介
- HDU1536,SG函数(①打表,②回溯),简单应用示例2
- 致2016年——我走过的路,洒下的泪........
- 虚函数
- nyoj44 nyoj17 HDU1087 DP动规 连续字符串的和最大值 单调递增最长子序列 单调递增子序列最小个数 非连续最大递增子序列
- UVALive 7148 LRIP(树分治+STL)
- ios隐藏系统音量图标,并监听系统声音
- Nmap扫描原理与用法