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 }
  • 相关阅读:
    jQuery实现图片延迟加载
    小猪学设计模式之—装饰者模式
    设计原则—依赖倒转原则
    ASP.NET MVC 在子页中引用头文件
    关于博客
    关于借钱
    面向对象编程(OOP)基础之UML基础
    C#抽象类、抽象方法、抽象属性
    小猪学设计模式——门面模式(外观模式)
    Eclipse 快捷键
  • 原文地址:https://www.cnblogs.com/mycups/p/8527911.html
Copyright © 2011-2022 走看看