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 ? ‘\n‘ : ‘ ‘);
            }
        }
    }
}

原文地址:https://www.cnblogs.com/TheRoadToTheGold/p/8186019.html

时间: 2024-10-09 14:35:04

poj 2947 Widget Factory (高斯消元解同余方程组+判断无解、多解)的相关文章

[ACM] POJ 2947 Widget Factory (高斯消元)

Widget Factory Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 4436   Accepted: 1502 Description The widget factory produces several different kinds of widgets. Each widget is carefully built by a skilled widgeteer. The time required to

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

链接:poj 2947 题意:生产一些零件,已知零件种数,记录条数 记录只记录了某次生产从周几开始,周几结束,以及生产了哪些产品. 每件商品生产所需天数为3-9天. 求每样产品需要多少天才能完成. 若无解输出Inconsistent data. 有无穷解输出Multiple solutions. 有唯一解,输出其解 分析:根据题目所给信息,可以列出同余方程组,再根据高斯消元求解, 但还得判断是无解,无穷解,还是唯一解 1.系数矩阵的秩若与增广矩阵的秩不相等,则无解,否则有解 2.若有解,若增广矩

poj 2947 Widget Factory(高斯消元)

description The widget factory produces several different kinds of widgets. Each widget is carefully built by a skilled widgeteer. The time required to build a widget depends on its type: the simple widgets need only 3 days, but the most complex ones

Poj 2947 widget factory (高斯消元解同模方程)

题目连接: http://poj.org/problem?id=2947 题目大意: 有n种类型的零件,m个工人,每个零件的加工时间是[3,9],每个工人在一个特定的时间段内可以生产k个零件(可以相同种类,也可以不同种类),问每种零件生产一个出来需要的时间? 解题思路: 给出的时间段是从周几到周几,并没有给出具体的时间段,因此在计算过程中要进行取模,还有就是对每个零件要在题目要求的范围内进行枚举. ps:如果求出来的增广矩阵是n*n的,但是某个零件在[3,9]之间没有合理的解,也是无解的. 1

uva 1564 - Widget Factory(高斯消元+逆元)

题目链接:uva 1564 - Widget Factory 题目大意:n种零件,m次工作日程,零件序号从1到n,给出m次工作日程的信息,x,s,e,表示生产了x个零件,从星期s开始到星期e(有可能是多个星期),然后给出生产的x个零件的序号.求每个零件被生产需要多少天(保证在3到10天) 解题思路:因为不能确定每个工作日程具体生产了几天,所以对应列出的方程均为线性模方程(模7),所以在高斯消元的过程中遇到除法要转换成乘上逆元. #include <cstdio> #include <cs

POJ 2947 Widget Factory (高斯消元 判多解 无解 和解集 模7情况)

题目链接 题意: 公司被吞并,老员工几乎全部被炒鱿鱼.一共有n种不同的工具,编号1-N(代码中是0—N-1), 每种工具的加工时间为3—9天 ,但是现在老员工不在我们不知道每种工具的加工时间,庆幸的是还保留着一些对工人制造工具的记录,对于每个老员工,他的记录包括,他开始工作的时间(在某个星期的星期几),被炒鱿鱼的时间(某个星期的星期几),在第几个星期不知道.....在这段时间里,他正好加工了k件物品,给出了这k件物品的编号.我们要做的就是通过这些记录,来确定每种工具的加工时间是多少. 分析: 对

POJ2947Widget Factory(高斯消元解同模方程)

http://poj.org/problem?id=2947 题目大意:有n 种装饰物,m 个已知条件,每个已知条件的描述如下:p start enda1,a2......ap (1<=ai<=n)第一行表示从星期start 到星期end 一共生产了p 件装饰物(工作的天数为end-start+1+7*x,加7*x 是因为它可能生产很多周),第二行表示这p 件装饰物的种类(可能出现相同的种类,即ai=aj).规定每件装饰物至少生产3 天,最多生产9 天.问每种装饰物需要生产的天数.如果没有解,

poj 1830 开关问题 高斯消元

mnesia在频繁操作数据的过程可能会报错:** WARNING ** Mnesia is overloaded: {dump_log, write_threshold},可以看出,mnesia应该是过载了.这个警告在mnesia dump操作会发生这个问题,表类型为disc_only_copies .disc_copies都可能会发生. 如何重现这个问题,例子的场景是多个进程同时在不断地mnesia:dirty_write/2 mnesia过载分析 1.抛出警告是在mnesia 增加dump

POJ 1166 The Clocks 高斯消元 + exgcd(纯属瞎搞)

根据题意可构造出方程组,方程组的每个方程格式均为:C1*x1 + C2*x2 + ...... + C9*x9 = sum + 4*ki; 高斯消元构造上三角矩阵,以最后一个一行为例: C*x9 = sum + 4*k,exgcd求出符合范围的x9,其他方程在代入已知的变量后格式亦如此. 第一发Gauss,蛮激动的. #include <algorithm> #include <iostream> #include <cstring> #include <cstd