zoukankan      html  css  js  c++  java
  • 「POJ2947」Widget Factory

    高斯消元模板

    需要判断无解和多解

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cstring>
     4 #include<cmath>
     5 #define db double
     6 using namespace std;
     7 const int N=310,mod=7;
     8 int n,m,inv[10];
     9 int mat[N][N];
    10 inline int getday(char *s){
    11     if(s[0]=='M') return 1;
    12     if(s[0]=='T') return s[1]=='U'?2:4;
    13     if(s[0]=='W') return 3;
    14     if(s[0]=='F') return 5;
    15     if(s[0]=='S') return s[1]=='A'?6:0;
    16 }
    17 inline int gauss(){ //无解返回0,多解返回-1,唯一解返回1 
    18     int now=1,nxt;
    19     for(int i=1;i<=n;i++){
    20         nxt=-1; 
    21         for(int j=now;j<=m;j++) if(mat[j][i]){nxt=j;break;}
    22         if(nxt==-1) continue;
    23         if(nxt!=now) for(int j=i;j<=n+1;j++) swap(mat[now][j],mat[nxt][j]);
    24         for(int j=now+1;j<=m;j++){
    25             int temp=mat[j][i]*inv[mat[now][i]]%mod;
    26             for(int k=i;k<=n+1;k++) mat[j][k]=((mat[j][k]-temp*mat[now][k])%mod+mod)%mod;
    27         }
    28         now++;
    29     }
    30     for(int i=1;i<=m;i++)if(mat[i][n+1]){
    31         bool flag=1;
    32         for(int j=1;j<=n;j++) if(mat[i][j]){flag=0;break;}
    33         if(flag) return 0;
    34     }
    35     if(now<=n) return -1;
    36     for(int i=n;i>=1;i--){
    37         mat[i][n+1]=mat[i][n+1]*inv[mat[i][i]]%mod;
    38         for(int j=1;j<=i-1;j++) mat[j][n+1]=((mat[j][n+1]-mat[j][i]*mat[i][n+1])%mod+mod)%mod;
    39         if(mat[i][n+1]<3) mat[i][n+1]+=mod;
    40     }
    41     return 1;
    42 }
    43 void solve(){
    44     if(!n) exit(0);
    45     int t1,k;
    46     char s1[10],s2[10];
    47     for(int i=1;i<=m;i++){
    48         scanf("%d%s%s",&k,s1,s2);
    49         mat[i][n+1]=(getday(s2)-getday(s1)+8)%7;
    50         for(int j=1;j<=k;j++) scanf("%d",&t1),mat[i][t1]+=1;
    51         for(int j=1;j<=n;j++) mat[i][j]%=mod;
    52     }
    53     int x=gauss();
    54     if(!x) printf("Inconsistent data.
    ");
    55     else if(x==-1) printf("Multiple solutions.
    ");
    56     else{
    57         for(int i=1;i<n;i++) printf("%d ",mat[i][n+1]);
    58         printf("%d
    ",mat[n][n+1]);
    59     }
    60     memset(mat,0,sizeof(mat));
    61     return;
    62 }
    63 int main(){
    64     for(int i=1;i<7;i++) inv[i]=int(pow(1.0*i,5))%7;
    65     while(scanf("%d%d",&n,&m)) solve();
    66     return 0;
    67 }
  • 相关阅读:
    linux下shell显示-bash-4.1#不显示路径解决方法
    update chnroute
    An error "Host key verification failed" when you connect to other computer by OSX SSH
    使用dig查询dns解析
    DNS被污染后
    TunnelBroker for EdgeRouter 后记
    mdadm详细使用手册
    关于尼康黄的原因
    Panda3d code in github
    Python实例浅谈之三Python与C/C++相互调用
  • 原文地址:https://www.cnblogs.com/mycups/p/8527911.html
Copyright © 2011-2022 走看看