poj 2947 Widget Factory(高斯消元)
来源:互联网 发布:手机号码信息查询软件 编辑:程序博客网 时间:2024/06/07 09:27
根据样例列出来方程,解出来结果是1,3,实际结果是8,3。。懵逼了,一周最多七天,怎么会有8。搜了下题解才知道这中间可能隔着很多周,那这就是用高斯消元解线性同余方程组了,而且方程很好列,把kuangbin大佬板子拿来就是了。(板子就是这道题)
具体意思看这里:http://blog.csdn.net/qingshui23/article/details/52511894
#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;const int mod = 7;const int MAXN = 400;int a[MAXN][MAXN];int x[MAXN];int gcd(int a, int b){ if(b == 0) return a; return gcd(b,a%b);}int lcm(int a, int b){ return a/gcd(a,b)*b;}long long inv(long long a, long long m){ if(a == 1) return 1; return inv(m%a,a)*(m-m/a)%m;}int change(char* s){ if(strcmp(s,"MON") == 0) return 1; else if(strcmp(s,"TUE")==0) return 2; else if(strcmp(s,"WED")==0) return 3; else if(strcmp(s,"THU")==0) return 4; else if(strcmp(s,"FRI")==0) return 5; else if(strcmp(s,"SAT")==0) return 6; else return 7;}//equ行,var列int Gauss(int equ, int var){ int maxR,col,k; for(k = 0, col = 0; k < equ && col < var; ++k,++col) { maxR = k; for(int i = k+1; i < equ; ++i) if(abs(a[i][col]) > abs(a[maxR][col])) maxR = i; if(a[maxR][col] == 0) { k--; continue; } if(maxR != k) for(int j = col; j < var+1; ++j) swap(a[k][j],a[maxR][j]); for(int i = k+1; i < equ; ++i) { if(a[i][col] != 0) { 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] < 0) tb = -tb; for(int 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][col] != 0) return -1; if(k < var) return var-k; for(int i = var-1; i >= 0; --i) { int temp = a[i][var]; for(int j = i+1; j < var; ++j) { if(a[i][j] != 0) { temp -= a[i][j]*x[j]; temp = (temp%mod+mod)%mod; } } x[i] = (temp*inv(a[i][i],mod))%mod; } return 0;}int main(){ int n,m; while(scanf("%d %d",&n,&m) && n+m) { memset(a,0,sizeof(a)); char str1[10],str2[10]; int k; for(int i = 0; i < m; ++i) { scanf("%d %s %s",&k,str1,str2); a[i][n] = ((change(str2)-change(str1)+1)%mod+mod)%mod; int t; while(k--) { scanf("%d",&t); t--; a[i][t]++; a[i][t] %= mod; } } int res = Gauss(m,n); if(res == 0) { for(int i = 0; i < n; ++i) if(x[i] <= 2) x[i] += 7; for(int i = 0; i < n-1; ++i) printf("%d ",x[i]); printf("%d\n",x[n-1]); } else if(res == -1) printf("Inconsistent data.\n"); else printf("Multiple solutions.\n"); } return 0;}
阅读全文
0 0
- poj 2947 Widget Factory(高斯消元)
- [ACM] POJ 2947 Widget Factory (高斯消元)
- poj 2947 Widget Factory(数学:高斯消元)
- POJ 2947 Widget Factory (高斯消元)
- POJ 2947 Widget Factory(高斯消元)
- poj 2947 Widget Factory (高斯消元)
- poj 2947 Widget Factory(高斯消元)
- POJ 2947 Widget Factory 高斯消元
- poj -- 2947 Widget Factory(高斯消元)
- POJ 2947 Widget Factory (高斯消元)
- poj 2947 Widget Factory (高斯消元)
- Widget Factory - POJ 2947 高斯消元
- poj 2947 Widget Factory (高斯消元)
- POJ 2947 Widget Factory(高斯消元)
- POJ 2947 Widget Factory(高斯消元)
- poj 2947 Widget Factory
- POJ 2947 Widget Factory
- POJ 2947 Widget Factory
- 使用GET获取gson 1.利用AsyncTask 2.输出流
- Windows下 Python 模块的安装方法
- SQL Server2008学习之(二) :软件下载与安装
- 世界名人的睡眠与成功
- Centos 7 配置LAMP 服务(建站)
- poj 2947 Widget Factory(高斯消元)
- 关于循环
- Lucene的分词器? 常用分词器介绍
- Java RMI 框架(远程方法调用)
- Linux笔记(一)基础
- 打铁感悟
- 268. Missing Number
- LeetCode125. Valid Palindrome
- 负数的十进制转二进制