HDU 5755 Gambler Bo 高斯消元解同余方程组
来源:互联网 发布:网络工商营业执照 编辑:程序博客网 时间:2024/05/20 18:54
参考:http://www.cnblogs.com/yohaha/p/5710264.html
2016 Multi-University Training Contest 3 1004 HDU 5755 Gambler Bo
高斯消元解同余方程组,我做的高斯消元的第一个题,解法完全是参考别人的,写博客就是存个板。
#include<stdio.h>#include<algorithm>#include<iostream>#include<string.h>#include<math.h>using namespace std;const int MAXN=905;int dx[] = {0,1,0,-1};int dy[] = {1,0,-1,0};int b[MAXN];int a[MAXN][MAXN];//增广矩阵int x[MAXN];//解集bool free_x[MAXN];//标记是否是不确定的变元int n,m;const int mod = 3;int gcd(int a, int b){ return b?gcd(b, a%b):a;}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, m)*(m-m/a)%m;}void gauss(int equ, int var){ int max_r, col, k; for(k = 0, col = 0; k < equ && col < var; k++, col++) { max_r = k; for(int i = k + 1; i < equ; i ++) { if(abs(a[i][col]) > abs(a[max_r][col])) max_r = i; } if(a[max_r][col] == 0) { k--; continue; } if(max_r != k) { for(int j = col; j < var+1; j++) { swap(a[k][j], a[max_r][j]); } } for(int i = k + 1; i < equ; 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] < 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 = var-1; i >= 0; i--) { int tmp = a[i][var]; for(int j = i+1; j < var; j++) { if(a[i][j]) { tmp -= a[i][j]*x[j]; tmp = (tmp%mod+mod)%mod; } } x[i] = a[i][i]*tmp%mod; } }}bool ok(int x){ if(x >= 0 && x < m*n) return 1; return 0;}int main(void){ int t; scanf("%d", &t); while(t--) { memset(x,0,sizeof(x)); memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); scanf("%d%d", &m, &n); for(int i = 0; i < m * n; ++i) scanf("%d", &b[i]); for(int i = 0; i < m * n; ++i) { int r = i + 1, l = i - 1, u = i - n, d = i + n; if(ok(r) && (i+1) % n != 0) a[i][r] = 1; if(ok(l) && i % n != 0) a[i][l] = 1; if(ok(u)) a[i][u] = 1; if(ok(d)) a[i][d] = 1; a[i][i] = 2; a[i][m*n] = (3 - b[i]) % 3; } gauss(n*m,n*m); int cnt = 0; for(int i = 0; i < n*m; ++i) cnt += x[i]; printf("%d\n", cnt); for(int i = 0; i < n*m; ++i) while(x[i]) { printf("%d %d\n", i/n+1,i%n+1); x[i]--; } }return 0;}
0 0
- HDU 5755 Gambler Bo 高斯消元解同余方程组
- HDU 5755 Gambler Bo(高斯消元解同余方程)
- HDU 5755 Gambler Bo
- HDU 5755 Gambler Bo
- HDU 5755 Gambler Bo
- HDU-5755-Gambler Bo-高斯消元
- hdu 5755 Gambler Bo【gauss】
- [高斯消元] HDU 5755 Gambler Bo
- 【HDU 5755】Gambler Bo(高斯消元)
- [HDU 5755] Gambler Bo (高斯消元)
- hdu 5755 Gambler Bo 高斯消元 + 取余逆元
- hdu-5755-D - Gambler Bo-高斯消元
- HDU 5755 Gambler Bo(高斯消元)
- Hdu 1573 线性同余方程组
- HDU 3430 置换群 + 同余方程组
- poj_2065 SETI(高斯消元解同余方程组)
- 同余方程组问题
- 同余方程组求解
- 数据结构实验之链表三:链表的逆置
- POJ 2377 (最大生成树 Kruskal)
- android studio下ndk开发
- poj 2251 Dungeon Master (BFS)
- 关于C语言入门的小知识点
- HDU 5755 Gambler Bo 高斯消元解同余方程组
- java类加载器
- 河南多校大一训练赛(最小生成树k算法)
- MySQL存储过程
- JavaScript数组去重的6个方法
- 快速二分幂
- Kotlin 开发Android 笔记1:Kotlin介绍及项目配置
- CS231n Class Notes- lecture11 ConvNets in Practice
- Y-bao/PullRefreshView 2.0 通用弹性阻尼 和 下拉刷新、上拉加载控件