【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 ...
随机推荐
- java线程一之创建线程、线程池以及多线程运行时间统计
线程和进程的基本概念 进程和线程是动态的概念. 进程是 "执行中的程序",是一个动词,而程序是一个名词,进程运行中程序的"代码",而且还有自己的 ...
- SOA架构的理解
实践论认为:从实践提升到理论,再由理论指导实践,由此向前发展.目前SOA的发展的情况………… 通过不少实践,SOA的模型己经被公认为标准规范,目前是正需要进一步总结上升到理论的时候了. SOA架构的演 ...
- 数据库性能优化之SQL优化
网上有关SQL优化的方案有很多,但多是杂乱无章.近日闲暇抽空整理了一下,方便大家以后的查阅,若发现其中有什么问题和不全,欢迎大家在下面纠正和补充: 1. 对于SQL语句的性能优化,主要体现在对于查询语 ...
- Swoole和Swoft的那些事 (Http/Rpc服务篇)
https://www.jianshu.com/p/4c0f625d5e11 Swoft在PHPer圈中是一个门槛较高的Web框架,不仅仅由于框架本身带来了很多新概念和前沿的设计,还在于Swoft是一 ...
- C# 知识回顾 - 表达式树 Expression Trees
C# 知识回顾 - 表达式树 Expression Trees 目录 简介 Lambda 表达式创建表达式树 API 创建表达式树 解析表达式树 表达式树的永久性 编译表达式树 执行表达式树 修改表达 ...
- [Redis]在Windows下的下载及安装
1.下载 下载地址: https://github.com/MSOpenTech/redis, 下载并解压到特定的目录. 2.启动Redis服务端 CMD -> redis-server.exe ...
- Python运算符与编码
阅读目录 while 循环 运算符 编码的问题 单位转换 整数 布尔值 while 循环 在生活中,我们遇到过循环的事情吧?比如循环听歌.在程序中,也是存才的,这就是流程控制语句 while 1.基本 ...
- Stax解析XML示例代码
package org.itat.stax; import java.io.IOException; import java.io.InputStream; import javax.xml.pars ...
- iOS-系统 图片、视频 管理控制器UIImagePickerController
UIImagePickerController 是一个管理系统多媒体文件库(相册)中的图片.视频文件的视图控制器,诞生于iOS4之前,虽然功能不是很完善,我们仍可以用这个视图控制器做一些有创造 ...
- 【bzoj2274】[Usaco2011 Feb]Generic Cow Protests dp+树状数组
题目描述 Farmer John's N (1 <= N <= 100,000) cows are lined up in a row andnumbered 1..N. The cows ...