poj 2947 Widget Factory 高斯消元解模线性方程

来源:互联网 发布:qq微商软件 编辑:程序博客网 时间:2024/06/05 11:17

http://poj.org/problem?id=2947

思路:

http://blog.csdn.net/u013486414/article/details/46999499

http://blog.csdn.net/sr_19930829/article/details/38275863

#include<cstdio>#include<algorithm>#include<cstring>using namespace std;const int maxn = 310;int a[maxn][maxn];int x[maxn];int lcm(int a,int b){int GCD=__gcd(a,b);return (a/GCD) * b;}void print(int n,int m){for(int i=0;i<m;i++){for(int j=0;j<=n;j++)printf("%d ",a[i][j]);printf("\n");}printf("\n");}int Gauss(int equ,int var){int maxrow;int row=0,col=0,num=0;for(;row<equ&&col<var;row++,col++){maxrow=row;for(int k=row+1;k<equ;k++)if(abs(a[k][col])>abs(a[maxrow][col]))maxrow=k;if(maxrow!=row){for(int j=row;j<=var;j++)//swap(a[maxrow][j],a[row][j]);}if(a[row][col]==0){row--;continue;}for(int i=row+1;i<equ;i++){if(a[i][col]!=0){int LCM=lcm(a[row][col],a[i][col]);int tb=LCM/a[row][col];int ta=LCM/a[i][col];//if(a[row][col]<0&&a[i][col]>0||a[row][col]>0&&a[i][col]<0)tb=-tb;for(int j=0;j<=var;j++)a[i][j]=((a[i][j]*ta-a[row][j]*tb)%7+7)%7;//}}//print(var,equ);}for(int i=row;i<equ;i++)//无解 0~row-1 非零行 row~equ-1 零行 秩为row 自由变元个数 var - row if(a[i][col]!=0)return -1;if(row<var)return var-row;for(int i=var-1;i>=0;i--){int temp=a[i][var];for(int j=i+1;j<var;j++){if(a[i][j]!=0)temp-=a[i][j]*x[j];temp=(temp%7+7)%7;}while(temp%a[i][i]!=0)temp+=7;x[i]=(temp/a[i][i])%7;}return 0;}int trans(char a[]){if(strcmp("MON",a)==0)return 1;else if(strcmp("TUE",a)==0)return 2;else if(strcmp("WED",a)==0)return 3;else if(strcmp("THU",a)==0)return 4;else if(strcmp("FRI",a)==0)return 5;else if(strcmp("SAT",a)==0)return 6;else if(strcmp("SUN",a)==0)return 7;}int main(){int n,m;//freopen("in.txt","r",stdin);//freopen("out.txt","w",stdout);while(scanf("%d%d",&n,&m)&&(n+m)){int p;char s1[10],s2[10];memset(a,0,sizeof(a));for(int i=0;i<m;i++){scanf("%d",&p);scanf("%s%s",s1,s2);a[i][n]=((trans(s2)-trans(s1)+1)%7+7)%7;//printf("%d ",a[i][n]);for(int j=0;j<p;j++){int temp;scanf("%d",&temp);a[i][temp-1]++;a[i][temp-1]%=7;}}int f=Gauss(m,n);if(f==0){for(int i=0;i<n;i++){if(x[i]<=2)x[i]+=7;printf("%d",x[i]);if(i!=n-1)printf(" ");else printf("\n");}}else if(f==-1)printf("Inconsistent data.\n");elseprintf("Multiple solutions.\n");}}