【poj2947】高斯消元求解同模方程组【没有AC,存代码】
题意:
p start end
a1,a2......ap (1<=ai<=n)
第一行表示从星期start 到星期end 一共生产了p 件装饰物(工作的天数为end-start+1+7*x,
加7*x 是因为它可能生产很多周),第二行表示这p 件装饰物的种类(可能出现相同的种类,
即ai=aj)。规定每件装饰物至少生产3 天,最多生产9 天。问每种装饰物需要生产的天数。
如果没有解,则输出“Inconsistent data.”,如果有多解,则输出“Multiple solutions.”,如果
只有唯一解,则输出每种装饰物需要生产的天数。
的天数为b,则可以列出下列方程:
a1*x1+a2*x2+...an*xn = b (mod 7)
这样一共可以列出m个方程式,然后使用高斯消元来解。
int gauss(int n,int m)
{
int i,j,k,l,r;
for(i=,j=;j<=maxx(n,m-);j++)
{
r=i;
for(k=i+;k<=n;k++)
if(myabs(a[k][j])>myabs(a[r][j])) r=k;
if(a[r][j])
{
for(l=;l<=m;l++) swap(a[r][l],a[i][l]);
for(l=i+;l<=n;l++)
{
if(a[l][j])
{
int x=lcm(a[l][j],a[i][j]);
int la=x/a[i][j];
int lb=x/a[l][j];
for(k=i;k<=m;k++)
{
a[l][k]=((a[l][k]*lb-a[i][k]*la)%mod+mod)%mod;
}
}
}
i++;
}
}
// output(n,m);printf("i = %d\n",i);
for(j=minn(i,m);j<=n;j++)
if(a[j][m]) return -;//无解
if((i-)<(m-)) return ;//有无穷解
//求解唯一解(不能除,求逆元)
int b;
for(i=m-;i>=;i--)
{
for(j=i+;j<m;j++)
a[i][m]=((a[i][m]-a[j][m]*a[i][j])%mod+mod)%mod;
b=quickpow(a[i][i],mod-,mod);
a[i][m]=(a[i][m]*b)%mod;
if(a[i][m]<) a[i][m]+=mod;
}
return ;
}
代码:我真的不知道为什么wa了。。拍了一百年了。。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std; const int N=;
const int mod=;
int a[N][N];
char s1[],s2[]; void output(int n,int m)
{
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
printf("%d ",a[i][j]);
printf("\n");
}
printf("\n");
} int myabs(int x){return x> ? x:-x;}
int minn(int x,int y){return x<y ? x:y;}
int maxx(int x,int y){return x>y ? x:y;} int idx(char s[])
{
if(s[]=='M') return ;
if(s[]=='T' && s[]=='U') return ;
if(s[]=='W') return ;
if(s[]=='T' && s[]=='H') return ;
if(s[]=='F') return ;
if(s[]=='S' && s[]=='A') return ;
return ;
} int gcd(int x,int y)
{
if(y==) return x;
return gcd(y,x%y);
} int quickpow(int x,int y,int mod)
{
int ans=;
while(y)
{
if(y&) ans=(ans*x)%mod;
x=x*x;
y/=;
}
return ans;
} int lcm(int x,int y)
{
if(!x && !y) return ;
return x*y/gcd(x,y);
} int gauss(int n,int m)
{
int i,j,k,l,r;
for(i=,j=;j<=maxx(n,m-);j++)
{
r=i;
for(k=i+;k<=n;k++)
if(myabs(a[k][j])>myabs(a[r][j])) r=k;
if(a[r][j])
{
for(l=;l<=m;l++) swap(a[r][l],a[i][l]);
for(l=i+;l<=n;l++)
{
if(a[l][j])
{
int x=lcm(a[l][j],a[i][j]);
int la=x/a[i][j];
int lb=x/a[l][j];
for(k=i;k<=m;k++)
{
a[l][k]=((a[l][k]*lb-a[i][k]*la)%mod+mod)%mod;
}
}
}
i++;
}
}
// output(n,m);printf("i = %d\n",i);
for(j=minn(i,m);j<=n;j++)
if(a[j][m]) return -;//无解
if((i-)<(m-)) return ;//有无穷解
//求解唯一解(不能除,求逆元)
int b;
for(i=m-;i>=;i--)
{
for(j=i+;j<m;j++)
a[i][m]=((a[i][m]-a[j][m]*a[i][j])%mod+mod)%mod;
b=quickpow(a[i][i],mod-,mod);
a[i][m]=(a[i][m]*b)%mod;
if(a[i][m]<) a[i][m]+=mod;
}
return ;
} int main()
{
freopen("a.in","r",stdin);
while()
{
int x,n,m,num;
scanf("%d%d",&n,&m);
if(!n && !m) return ;
memset(a,,sizeof(a));
for(int i=;i<=m;i++)
{
scanf("%d%s%s",&num,s1,s2);
a[i][n+]=((idx(s2)-idx(s1)+)%mod+mod)%mod;
for(int j=;j<=num;j++)
{
scanf("%d",&x);
a[i][x]++;
a[i][x]%=mod;
}
}
// output(m,n+1);
int flag=gauss(m,n+);
if(flag==-) printf("Inconsistent data.\n");
if(flag==) printf("Multiple solutions.\n");
if(flag==)
{
for(int i=;i<n;i++) printf("%d ",a[i][n+]);
printf("%d\n",a[n][n+]);
}
}
return ;
}
【poj2947】高斯消元求解同模方程组【没有AC,存代码】的更多相关文章
- poj2947(高斯消元解同模方程组)
题目链接:http://poj.org/problem?id=2947 题意:有n 种装饰物,m 个已知条件,每个已知条件的描述如下: p start enda1, a2......ap (1< ...
- 【zoj3645】高斯消元求解普通线性方程
题意: 给你一个方程组(含有12个方程),求(x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11) 方程组的形式是一个二次方程组 (ai1-x1)^2 + (ai2-x2)^2 +( ...
- 【poj1830-开关问题】高斯消元求解异或方程组
第一道高斯消元题目~ 题目:有N个相同的开关,每个开关都与某些开关有着联系,每当你打开或者关闭某个开关的时候,其他的与此开关相关联的开关也会相应地发生变化,即这些相联系的开关的状态如果原来为开就变为关 ...
- POJ 1222 POJ 1830 POJ 1681 POJ 1753 POJ 3185 高斯消元求解一类开关问题
http://poj.org/problem?id=1222 http://poj.org/problem?id=1830 http://poj.org/problem?id=1681 http:// ...
- POJ 1830 开关问题(高斯消元求解的情况)
开关问题 Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 8714 Accepted: 3424 Description ...
- POJ2947Widget Factory(高斯消元解同模方程)
http://poj.org/problem?id=2947 题目大意:有n 种装饰物,m 个已知条件,每个已知条件的描述如下:p start enda1,a2......ap (1<=ai&l ...
- POJ 2065 高斯消元求解问题
题目大意: f[k] = ∑a[i]*k^i % p 每一个f[k]的值就是字符串上第 k 个元素映射的值,*代表f[k] = 0 , 字母代表f[k] = str[i]-'a'+1 把每一个k^i求 ...
- Poj 2947 widget factory (高斯消元解同模方程)
题目连接: http://poj.org/problem?id=2947 题目大意: 有n种类型的零件,m个工人,每个零件的加工时间是[3,9],每个工人在一个特定的时间段内可以生产k个零件(可以相同 ...
- poj2947 高斯消元
Widget Factory Time Limit: 7000MS Memory Limit: 65536K Total Submissions: 5218 Accepted: 1802 De ...
随机推荐
- HttpServletRequest和HttpServletResponse实例
先看一下web.xml文件配置: <?xml version="1.0" encoding="UTF-8"?> <web-app versio ...
- 项目--uml
[团队信息] 团队项目: 小葵日记--主打记录与分享模式的日记app 队名:日不落战队 队员信息及贡献分比例: 短学号 名 本次作业博客链接 此次作业任务 贡献分配 备注 501 安琪 http:// ...
- LintCode-56.两数之和
两数之和 给一个整数数组,找到两个数使得他们的和等于一个给定的数 target. 你需要实现的函数twoSum需要返回这两个数的下标, 并且第一个下标小于第二个下标.注意这里下标的范围是 1 到 n, ...
- linux解压zip
用 unzip 的先安装 yum install -y unzip #unzip file.zip -d /root -d指解压路径 ,不写的话默认当前目录
- 文件“bin\Debug\WindowsFormsApplication2.exe”正由另一进程使用,因此该进程无法访问该文件。
http://zhidao.baidu.com/question/221394579.html?qbl=relate_question_2&word=%BE%AF%B8%E6%094%09%C ...
- WriteLine(ls.ToString());Console.WriteLine(ls);输出结果相同,为什么要加 .ToString()
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test ...
- Activiti5工作流笔记二
流程变量 import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import org.activiti ...
- 【bzoj1708】[USACO2007 Oct]Money奶牛的硬币 背包dp
题目描述 在创立了她们自己的政权之后,奶牛们决定推广新的货币系统.在强烈的叛逆心理的驱使下,她们准备使用奇怪的面值.在传统的货币系统中,硬币的面值通常是1,5,10,20或25,50,以及100单位的 ...
- XML-RPC协议学习
XML-RPC调用包括2部分:客户端client(调用线程).服务器端server(被调用的线程).服务端是通过特定的URL获得的,调用过程如下: 1.客户端程序使用XML-RPC客户端发出作业请求, ...
- BZOJ1096:[ZJOI2007]仓库建设——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=1096 L公司有N个工厂,由高到底分布在一座山上.如图所示,工厂1在山顶,工厂N在山脚.由于这座山处于 ...