题意: 有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. android手机震动

    Vibrator是安卓提供的震动器,其没有构造器,通过getSystemService(Context.VIBRATOR_SERVICE)方法获取对象.但使用此类时需要在清单文件中添加访问权限andr ...

  2. SQL数据库开发知识总结:提高篇

    1.联合结果集 (1) 简单的结果集联合 select FNumber,FName,Fage from T_Employee\ union select FidCardNumber,FName,Fag ...

  3. 使用自签SSL证书有什么风险?

    http://mt.sohu.com/20150602/n414267586.shtml 所谓自签SSL证书,是指不受信任的任意机构或个人,使用工具自己签发的SSL证书.自签名SSL证书可以随意签发, ...

  4. asp.net中一般处理程序中添加session

    asp.net中使用一般处理程序(.ashx)添加session,利用context.session["xxx"] = value的方式把值保存到session:运行的时候会出现该 ...

  5. 详解Windows 7系统中IE8/IE9/IE10三个版本的关系(转)

    今年(2013)年初,微软开放了姗姗来迟的 IE10 for Windows 7 版本下载.至此,Windows 7 平台上可以运行三个 IE 浏览器版本.虽然 Windows 与 IE 经历了诸多版 ...

  6. N个数随机相加得出固定值的排列组合

    static double[] iArr = new double[10] { 1,2,3,4,5,6,7,8,9,10 }; static Stack<double> stack = n ...

  7. JS中undefined和null的区别

    在写JS脚本的时候,经常会碰到“为空”的判断,其中主要有null和undefined的判断.这两个为空判断的主要区别是: 1) null是JS的关键字,是语法特性.undefined是全局对象的属性, ...

  8. jQuery1.8以上,ajaxSend,ajaxStart等一系列事件要绑定在document上才有效果

    jQuery1.8以上,ajaxSend,ajaxStart等一系列事件要绑定在document上才有效果

  9. 利用javascript Location访问Url,重定向,刷新页面

    网上转来了, 方便以后查询参考 本文介绍怎么使用javascript Location对象读和修改Url.怎么重载或刷新页面.javascript提供了许多方法访问,修改当前用户在浏览器中访问的url ...

  10. 浅谈MVC、MVP、MVVM架构模式的区别和联系

    MVC.MVP.MVVM这些模式是为了解决开发过程中的实际问题而提出来的,目前作为主流的几种架构模式而被广泛使用. 一.MVC(Model-View-Controller) MVC是比较直观的架构模式 ...