题意: 有n种小工具要加工,每种工具的加工时间为3到9天,给了m条加工记录。

    每条记录 X $s_1$ $s_2$ 分别代表 这个工人在$s_1$到$s_2$(前闭后闭)的时间里加工了X件小工具

    下一行给出这X件小工具的种类

  要求的是每件工具的加工时间 (唯一解:输出各个时间;无解:Inconsistent data.;多个解:Multiple solutions.)

可以列出同余方程组:$\sum\limits_{i=0}^{n-1} a_i×x_i\equiv T \pmod{7}$

          ($a_i$是此人加工第i件物品的个数,$x_i$是第i件物品加工所需的时间,T是此人干活的时间)

     这样列出m个同余方程 组成方程组 用高斯消元

比如第一个案例:

2 3
2 MON THU
1 2
3 MON FRI
1 1 2
3 MON SUN
1 2 2 可以列出方程组:  

1×$x_0$+1×$x_1 \equiv 4 \pmod{7}$

2×$x_0$+1×$x_1 \equiv 5 \pmod{7}$

1×$x_0$+2×$x_1 \equiv 7 \pmod{7}$

\[ \left( \begin{array}{ccc}
1 & 1 & 4 \\
2 & 1 & 5 \\
1 & 2 & 7 \end{array} \right) \to \left( \begin{array}{ccc}
1 & 1 & 4 \\
1 & 0 & 1 \\
0 & 1 & 3 \end{array} \right) \to \left( \begin{array}{ccc}
1 & 0 & 1 \\
0 & 1 & 3 \\
0 & 0 & 0 \end{array} \right)\]

即得$x_0$=1,$x_1$=3
由题意 每种工具的加工时间为3到9天
故 $x_0$=8,$x_1$=3
解毕

下面是代码:

有mod就会有要求逆元
两种求逆元的方法 1. extend gcd
注意得到的x可能为负 要x=(x%mod+mod)%mod;
 void ex_gcd(int a, int b, int &x, int &y)
{
if(b)
{
ex_gcd(b, a%b, x, y);
int tmp=x;
x=y;
y=tmp-(a/b)*y;
}
else
{
x=, y=;
return ;
}
}

2.inverse element

注意  只适用于a<b 并且 ab互质

 int inv(int a, int b)
{
return a==? :inv(b%a, b)*(b-b/a)%b;
}

此题还有一法不求逆元:(利用欧拉函数)

即 把被除数不断加上mod 直到它能被除数整除为止

 while(tmp%a[i][i])
tmp+=mod;
x[i]=(tmp/a[i][i])%mod; 与以下等价 int xx, yy;
ex_gcd(a[i][i], mod, xx, yy);
xx=(xx%mod+mod)%mod;
x[i]=(tmp*xx)%mod; 与以下等价 x[i]=(tmp*inv(a[i][i], mod))%mod;

完整代码:

 const int mod=;
int gcd(int a, int b)
{
return b==? a:gcd(b, a%b);
}
int lcm(int a, int b)
{
return a/gcd(a, b)*b;
}
void ex_gcd(int a, int b, int &x, int &y)
{
if(b)
{
ex_gcd(b, a%b, x, y);
int tmp=x;
x=y;
y=tmp-(a/b)*y;
}
else
{
x=, y=;
return ;
}
} int a[][]; // 增广矩阵
int x[]; // 解
int free_x[]; // 标记是否为自由未知量 int Gauss(int n, int m) // n个方程 m个未知数 即 n行m+1列
{
//转换为阶梯形式
int col=, k, num=;
for(k=;k<n && col<m;k++, col++)
{//枚举行
int max_r=k;
for(int i=k+;i<n;i++)//找到第col列元素绝对值最大的那行与第k行交换
if(abs(a[i][col])>abs(a[max_r][col]))
max_r=i;
if(max_r!=k)// 与第k行交换
for(int j=col;j<m+;j++)
swap(a[k][j], a[max_r][j]);
if(!a[k][col])// 说明该col列第k行以下全是0了
{
k--;
free_x[num++]=col;
continue;
}
for(int i=k+;i<n;i++)// 枚举要删除的行
if(a[i][col])
{
int LCM=lcm(abs(a[i][col]), abs(a[k][col]));
int ta=LCM/abs(a[i][col]);
int tb=LCM/abs(a[k][col]);
if(a[i][col]*a[k][col]<)
tb=-tb;
for(int j=col;j<m+;j++)
a[i][j]=((a[i][j]*ta-a[k][j]*tb)%mod+mod)%mod;
}
} for(int i=k;i<n;i++)
if(a[i][col])
return -; // 无解 if(k<m) //m-k为自由未知量个数
return m-k; // 唯一解 回代
for(int i=m-;i>=;i--)
{
int tmp=a[i][m];
for(int j=i+;j<m;j++)
{
if(a[i][j])
tmp-=a[i][j]*x[j];
tmp=(tmp%+)%;
}
int xx, yy;
ex_gcd(a[i][i], mod, xx, yy);
xx=(xx%mod+mod)%mod;
x[i]=(tmp*xx)%mod;
}
return ;
} void init()
{
memset(a, , sizeof(a));
memset(x, , sizeof(x));
} int change(char c1, char c2)
{
if(c1=='M')
return ;
if(c1=='T' && c2=='U')
return ;
if(c1=='W')
return ;
if(c1=='T')
return ;
if(c1=='F')
return ;
if(c1=='S' && c2=='A')
return ;
return ;
} char s1[], s2[];
int main()
{
int n, m;
while(~scanf("%d%d", &n, &m))
{
if(!n && !m)
break;
init();
for(int i=;i<m;i++)
{
int X;
scanf("%d%s%s", &X, s1, s2);
a[i][n]=((change(s2[], s2[])-change(s1[], s1[])+)%mod+mod)%mod;
while(X--)
{
int t;
scanf("%d", &t);
a[i][t-]=(a[i][t-]+)%mod;
}
}
int t=Gauss(m, n);
if(t==-)
{
printf("Inconsistent data.\n");
continue;
}
if(t==)
{
for(int i=;i<n;i++)
if(x[i]<=)
x[i]+=;
for(int i=;i<n;i++)
{
printf("%d", x[i]);
if(i==n-)
printf("\n");
else
printf(" ");
}
continue;
}
printf("Multiple solutions.\n");
}
return ;
}

POJ 2947

[Gauss]POJ2947 Widget Factory的更多相关文章

  1. Widget Factory (高斯消元解线性方程组)

    The widget factory produces several different kinds of widgets. Each widget is carefully built by a ...

  2. 【POJ】2947 Widget Factory(高斯消元)

    http://poj.org/problem?id=2947 各种逗啊..还好1a了.. 题意我就不说了,百度一大把. 转换为mod的方程组,即 (x[1,1]*a[1])+(x[1,2]*a[2]) ...

  3. POJ Widget Factory 【求解模线性方程】

    传送门:http://poj.org/problem?id=2947 Widget Factory Time Limit: 7000MS   Memory Limit: 65536K Total Su ...

  4. UVA 1564 - Widget Factory(高斯消元)

    UVA 1564 - Widget Factory 题目链接 题意:n种零件, 给定m个制作时间.每段时间制作k个零件,每种零件有一个制作时间,每段时间用Mon到Sun表示,求每一个零件的制作时间.还 ...

  5. POJ 2947:Widget Factory 求同余方程

    Widget Factory Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 5173   Accepted: 1790 De ...

  6. POJ 2947 Widget Factory(高斯消元)

    Description The widget factory produces several different kinds of widgets. Each widget is carefully ...

  7. 使用 jQuery UI Widget Factory 编写有状态的插件(Stateful Plugins)

    使用 jQuery UI Widget Factory 编写有状态的插件(Stateful Plugins) Note 这一章节的内容是基于 Scott Gonzalez 一篇博客 Building ...

  8. poj 2947 Widget Factory

    Widget Factory 题意:有n件装饰品,有m组信息.(1 <= n ,m<= 300)每组信息有开始的星期和结束的星期(是在mod 7范围内的)并且还包括num种装饰品的种类(1 ...

  9. 软件公司的两种管理方式 总体来说,这个世界上存在两种不同的软件公司的组织结构。我把他们叫做 Widget Factory(小商品工厂) 和 Film Crews(电影工作组

    软件公司的两种管理方式 一个简单的回答应该是——“因为在我们的社会里,我们总是会认为薪水和会和职位的层次绑在一起”.但是,这个答案同时也折射出一个事实——我们的薪资是基于我们的所理解的价值,但这并没有 ...

随机推荐

  1. MySQL索引详解

    导读:大家都知道,一个MySQL数据库能够储存大量的数据,如果要查找那一个数据,就得费好大劲从一大堆的数据中找到,即费时间又费力气,这时,索引的出现就大大减轻了数据库管理员的工作.本文介绍了数据库索引 ...

  2. asp搜索两个以上的词的原理

    通常会在许多网站上进行搜索一些内容,要输入两个或两个以上的词,它的原理是这样的: 假设在搜索框search中输入:“asp php” 先得到输入框中的内容:search=request("s ...

  3. 使用MVCJqGrid的心得

    最近公司网站进行升级,项目要用.net mvc,mysql和轻量级orm框架dapper.由于美工页面出不来啊,让我先写简单写写后台的列表,同事说用MvcJqGrid,也得到了架构的同意. 可是不得不 ...

  4. JS 日期工具类-基于yDate

    源码下载 前言:最近在用到JS日期操作时,发现有一些不方便,于是搜素了一些网上的资料,基于一个开源工具类-yDate 进行了个性化定制,封装成了一个日期工具类工具函数大概介绍:1.普通的日期操作2. ...

  5. viewpager双层嵌套,子viewpager无限循环无法手动滑动

    项目中首页是用viewpager+fragment集成的,第一个fragment有广告轮播图使用viewpager实现的,开始就遇到是广告图无法手动滑动,事件被外层的viewpager拦截响应切换到下 ...

  6. SQLSERVER 数据库性能的基本

    很久没有写文章了,在系统正式上线之前,DBA一般都要测试一下服务器的性能 比如你有很多的服务器,有些做web服务器,有些做缓存服务器,有些做文件服务器,有些做数据库服务器 做数据库服务器的那台服务器性 ...

  7. Meteor:用户账号管理添加密码和微博weibo账号系统支持

    Meteor账户系统构建与accounts-base包之上,并为publish和methods提供userId的顶层支持.核心包提供的功能有:数据库中的用户记录支持:额外的包提供密码安全验证:第三方登 ...

  8. WebService开发常用功能详解

    一.WebService中常用的属性(Attributes)1. Web Service(Web服务)提供以下三个属性.    Namespace:此属性的值包含 XML Web Service的默认 ...

  9. ASP.NET Web API——选择Web API还是WCF

    WCF是.NET平台服务开发的一站式框架,那么为什么还要有ASP.NET Web API呢?简单来说,ASP.NET Web API的设计和构建只考虑了一件事情,那就是HTTP,而WCF的设计主要是考 ...

  10. 二叉搜索的各种bugs——重复递增序列

    int binary_search(int* A, int value, int p, int r); int main(int argc, char *argv[]){ , , , , , , , ...