zoukankan      html  css  js  c++  java
  • poj 2947 Widget Factory (高斯消元解同余方程组+判断无解、多解)

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

    血泪史:

    CE:poj的string类型要加string库,swap不能直接交换数组

     WA:

    x[m-1]也有可能<3啊O(≧口≦)O

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    
    using namespace std;
    
    const int mod=7;
    
    int n,m;
    char ch[7][4] = {"MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"};  
    
    int a[301][301];
    int x[301];
    
    int inv[10001];
    
    void read(int &x)
    {
        x=0; char c=getchar();
        while(!isdigit(c))  c=getchar(); 
        while(isdigit(c)) { x=x*10+c-'0'; c=getchar();  }
    }
    
    int getgcd(int a,int b) { return !b ? a : getgcd(b,a%b); }
    
    int getlcm(int a,int b) { return a*b/getgcd(a,b); }
    
    void preinv()
    {
        inv[1]=1;
        for(int i=2;i<=10000;++i) inv[i]=(-mod/i*inv[mod%i]%mod+mod)%mod;
    }
    
    int gauss()
    {
        int equ=n,var=m;
        int i,j,k;
        int max_r,col;
        int ta,tb,lcm;
        int tmp;
        for(k=0,col=0;k<equ && col<var;++k,++col)
        {
            max_r=k;
            for(i=k+1;i<equ;++i)
                if(abs(a[i][col])>abs(a[max_r][col])) max_r=i;
            if(!a[max_r][col]) { --k; continue; }
            if(k!=max_r) 
                for(j=col;j<var+1;++j) swap(a[k][j],a[max_r][j]);
            for(i=k+1;i<equ;++i)
                if(a[i][col])
                {
                    lcm=getlcm(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<var+1;++j) a[i][j]=((a[i][j]*ta-a[k][j]*tb)%mod+mod)%mod;
                }
        }
        for(int i=k;i<equ;++i) 
            if(a[i][var]) return -1;
        if(k<var) return -2;
        for(int i=var-1;i>=0;--i)
        {
            tmp=a[i][var];
            for(j=i+1;j<var;++j)
                if(a[i][j]) 
                {
                    tmp-=a[i][j]*x[j];
                    tmp=(tmp%mod+mod)%mod;
                }
            x[i]=tmp*inv[a[i][i]]%mod;
        }
        return 0;
    }
    
    int turn(char *c)
    {
        for(int i=0;i<7;++i)
            if(!strcmp(c,ch[i])) return i+1;
    }
    
    int main()
    {
        int k,xi;
        char c[4];
        int s,t;
        preinv();
        while(scanf("%d%d",&m,&n)!=EOF)
        {
            if(!m) return 0;
            memset(a,0,sizeof(a));
            for(int i=0;i<n;++i)
            {
                read(k);
                scanf("%s",c);
                s=turn(c);
                scanf("%s",c);
                t=turn(c);
                a[i][m]=(t-s+7+1)%7;
                while(k--)
                {
                    read(xi);
                    a[i][xi-1]++;
                }
            }
            for(int i=0;i<n;++i)
                for(int j=0;j<m;++j)
                    a[i][j]%=mod;
            int ans=gauss();
            if(ans==-1) puts("Inconsistent data.");
            else if(ans==-2) puts("Multiple solutions.");
            else
            {
                for(int i=0;i<m;++i) 
                {
                    if(x[i]<3) x[i]+=7;
                    printf("%d%c",x[i],i==m-1 ? '
    ' : ' ');
                }
            }
        }
    }
  • 相关阅读:
    sql server 2008 64位连接sql 2000服务器的时候出现
    MySQL忘记密码怎么修改密码
    vs2015 行数统计
    javascript和c#aes加密方法互解
    vs2015 不能启动 iis express
    修改oracle的字符集操作方法
    PL/SQL Developer连接本地Oracle 11g 64位数据库
    CodeSmith Generator 7.0.2激活步骤
    PetaPoco利用ODP.NET Managed Driver连接Oracle
    解决Chrome插件安装时出现的“程序包无效”问题亲测可用
  • 原文地址:https://www.cnblogs.com/TheRoadToTheGold/p/8186019.html
Copyright © 2011-2022 走看看