POJ-2065 SETI 高斯消元,扩展GCD
该题题义是给定如下一个方程组:
F(1) = C1 (mod) P
F(2) = C2 (mod) P
F(3) = C3 (mod) P ...
其中F(1) = A(1,1)*x1 + A(1, 2)*x2 + A(1, 3)*x3...
其中A(i, j) = i ^ (j-1).
面对这样一个方程,我们的做法就是先不管方程右端的(mod)P,因为F(i) 和 Ci 是同余的,那么在方程两端乘以一个数是没有影响的,代入某一个方程同样是允许的。于是剩下的就是高斯消元。由于解是唯一的,因此解出来的系数矩阵一定是满秩。接下来就可一用扩展gcd求解未知元了。
代码如下:
#include <cstdlib> #include <cstring> #include <algorithm> #include <cstdio> using namespace std;typedef long long int Int64;char s[100];int length, MOD;Int64 x[100];int _pow(int a, int b) { // 快速幂int ret = 1;while (b) {if (b & 1) {ret *= a;ret %= MOD;}a *= a;a %= MOD;b >>= 1;}return ret; }struct Matrix {Int64 a[100][100];void init(){for (int i = 1; i <= length; ++i) {for (int j = 1; j <= length; ++j) {a[i][j] = _pow(i, j-1);}a[i][length+1] = s[i];}}void rswap(int x, int y, int s){ // 用于将后面的行交换到第一行上面来 Int64 t;for (int j = s; j <= length+1; ++j) {t = a[x][j];a[x][j] = a[y][j];a[y][j] = t;}}void multi(int x, Int64 M, int s){ // 同一行乘以某一数,当然这时为消元准备的for (int j = s; j <= length+1; ++j) {a[x][j] *= M;}}void relax(int x, int y, int s){ // 将某一方程整体迭代进另外一个表达式for (int j = s; j <= length + 1; ++j) {a[y][j] -= a[x][j];a[y][j] = (a[y][j] % MOD + MOD) % MOD;a[x][j] = (a[x][j] % MOD + MOD) % MOD;}}void print(){for (int i = 1; i <= length; ++i) {for (int j = 1; j <= length+1; ++j) {printf("%5I64d ", a[i][j]);}puts("");}puts("");} }M;Int64 GCD(Int64 a, Int64 b) {Int64 t;while (b) {t = b;b = a % b;a = t;}return a; }Int64 LCM(Int64 a, Int64 b) {return a / GCD(a, b) * b; }Int64 ext_gcd(Int64 a, Int64 b, Int64 &x, Int64 &y) {Int64 temp, ret;if (!b) {x = 1, y = 0;return a;}ret = ext_gcd(b, a % b, x, y);temp = x, x = y, y = temp - a/b*y;return ret; }void Gauss() {int i = 1, k;Int64 a, b, sum;memset(x, 0, sizeof (x));for (int j = 1; j <= length; ++j) {for (k = i; k <= length; ++k) {if (M.a[k][j]) break; }if (k > length) continue;if (k != i) {M.rswap(i, k, j);}for (k = i + 1; k <= length; ++k) {if (M.a[k][j]) {Int64 lcm = LCM(M.a[i][j], M.a[k][j]);a = lcm/M.a[i][j];b = lcm/M.a[k][j];if (a > 1) M.multi(i, a, j);if (b > 1) M.multi(k, b, j);M.relax(i, k, j);}}++i;}// M.print();// 一定会有唯一解,所以没有进行无解判定for (k = i-1; k >= 1; --k) { // 当然这里可以暴力进行求解,毕竟给定的素数不是很大Int64 xx, yy, A, B, C = 0, L, G;for (int j = k+1; j <= length; ++j) {C += x[j] * M.a[k][j];}A = M.a[k][k], B = MOD;C = M.a[k][length+1] - C; G = ext_gcd(A, B, xx, yy);L = B / G;xx *= C / G; xx = (xx % L + L) % L;x[k] = xx;}for (int j = 1; j <= length; ++j) {printf(j == 1 ? "%I64d" : " %I64d", x[j]);}puts(""); }int main() {int N;scanf("%d", &N);while (N--) {scanf("%d %s", &MOD, s+1);length = strlen(s+1);for (int i = 1; i <= length; ++i) {if (s[i] != '*') {s[i] -= ('a' - 1);}else {s[i] = 0;}}M.init();Gauss();}return 0; }
POJ-2065 SETI 高斯消元,扩展GCD相关推荐
- POJ 2065 SETI [高斯消元同余]
题意自己看,反正是裸题... 普通高斯消元全换成模意义下行了 模模模! #include <iostream> #include <cstdio> #include <c ...
- POJ - 2065 SETI(高斯消元解方程(取模))
题目链接:点击查看 题目大意:给出一个质数作为 mod,再给出一个字符串,每个字母对应着一个数字: ' * ' = 0 ' a ' = 1 ' b ' = 2 ... ' z ' = 26 假设字符串 ...
- POJ 2947 Widget Factory (高斯消元解同余方程组)
题意:N种物品,M条记录,接写来M行,每行有K,str1,str2,表示第i个记录从星期str1到星期str2,做了K件物品,接下来的K个数为物品的编号.求做每个物品所需的时间,并且最后结果在3-9之 ...
- poj 1681 Painter#39;s Problem(高斯消元)
http://poj.org/problem? id=1681 求最少经过的步数使得输入的矩阵全变为y. 思路:高斯消元求出自由变元.然后枚举自由变元,求出最优值. 注意依据自由变元求其它解及求最优值 ...
- POJ 1222 EXTENDED LIGHTS OUT(高斯消元)
[题目链接] http://poj.org/problem?id=1222 [题目大意] 给出一个6*5的矩阵,由0和1构成,要求将其全部变成0,每个格子和周围的四个格子联动,就是说,如果一个格子变了 ...
- POJ 1753 Flip Game 高斯消元
和1222,1681差不多 POJ 1222 高斯消元更稳 POJ 1681 高斯消元 枚举自由变元 equ = 16 ,var = 16的方程组 #include <cstdio> #i ...
- POJ 1222 1681 1830 3185 开关灯问题 (高斯消元 异或方程组)
POJ 1222 EXTENDED LIGHTS OUT 基本的开关灯问题.还保证唯一解. 我们把每一个灯泡当成一个状态xi,总共有30个,而且每个灯与其他灯的关系也很明显.所以我们就可以列30方程3 ...
- 高斯消元 zoj 3645 poj 1222/XOR消元
double a[maxn][maxn] , x[maxn] ; //a[i][j] 系数矩阵 , a[i][n+1] = y[i] , x解 int n ; //n个方程 void guass(){ ...
- POJ 1830 开关问题 高斯消元
题意:给你N个开关,其中某些开关之间是相互影响的,即一个开关控制多个,那么每个开关操作与否为一个变元,有N个变元,开关之间相互影响的系数设为1,否则为0,对模2高斯消元求解自由变元个数. #inclu ...
最新文章
- javascript实现的有缩略图功能的幻灯片切换效果
- Bash中的管道输出和捕获退出状态
- python测试之道进阶,Pytest-Mock 进阶用法详解
- 12-函数的定义+自调+实参及形参理解
- 基于边缘计算的森林火警监测系统
- 2012计算机一级考试试题,2012年计算机一级考试试题题库(备考)
- 使用frp实现内网穿透
- DPDK报文分类与访问控制
- python not_刚接触Python,python中not in怎么解释?求解释一下?
- 通过Python将不同的附件发给不同的收件人
- Qt简单实现UDP通信
- div+css实现盖章
- 多个excel合并为一个excel的多个sheet
- 合生活门禁复制数据结构分析
- Linux学习(1):在服务器上与团队共享文件,workgroup这个用户组相关操作命令
- 最燃黑客情报官薛锋:端起AK伏特加,代表人民把坏人抓
- ERC20重要补充之approveAndCall
- 1+1≠2 |A/B 测试中的赢者诅咒
- HCIE 面试资料-BFD/NSF/NSR/NTP
- unplugin-auto-import的配置和eslint报错解决
热门文章
- Springboot工程下使用mybatis反向工程
- python程序编程千分符号怎么输入_教你用Python来玩“微信跳一跳”瞬间千分……已开源...
- mysql.info文件是什么_info 数据库
- 一周一论文(翻译 总结)— [SOCC 14] DaRPC: Data Center RPC 基于RDMA的高性能通信RPC
- linux创建更改目录,如何使用Linux中的单个命令创建新目录并更改它 | MOS86
- python中变量类型在程序中可以改变_python的可变与不可变数据类型
- (转) 共享个很棒的vim配置
- 小程序页面遮罩且不能滚动 + 内容居中显示
- Metasploit的三种启动方式
- -Xms -Xmx -Xmn -Xss -XX: