该题题义是给定如下一个方程组:

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相关推荐

  1. POJ 2065 SETI [高斯消元同余]

    题意自己看,反正是裸题... 普通高斯消元全换成模意义下行了 模模模! #include <iostream> #include <cstdio> #include <c ...

  2. POJ - 2065 SETI(高斯消元解方程(取模))

    题目链接:点击查看 题目大意:给出一个质数作为 mod,再给出一个字符串,每个字母对应着一个数字: ' * ' = 0 ' a ' = 1 ' b ' = 2 ... ' z ' = 26 假设字符串 ...

  3. POJ 2947 Widget Factory (高斯消元解同余方程组)

    题意:N种物品,M条记录,接写来M行,每行有K,str1,str2,表示第i个记录从星期str1到星期str2,做了K件物品,接下来的K个数为物品的编号.求做每个物品所需的时间,并且最后结果在3-9之 ...

  4. poj 1681 Painter#39;s Problem(高斯消元)

    http://poj.org/problem? id=1681 求最少经过的步数使得输入的矩阵全变为y. 思路:高斯消元求出自由变元.然后枚举自由变元,求出最优值. 注意依据自由变元求其它解及求最优值 ...

  5. POJ 1222 EXTENDED LIGHTS OUT(高斯消元)

    [题目链接] http://poj.org/problem?id=1222 [题目大意] 给出一个6*5的矩阵,由0和1构成,要求将其全部变成0,每个格子和周围的四个格子联动,就是说,如果一个格子变了 ...

  6. POJ 1753 Flip Game 高斯消元

    和1222,1681差不多 POJ 1222 高斯消元更稳 POJ 1681 高斯消元 枚举自由变元 equ = 16 ,var = 16的方程组 #include <cstdio> #i ...

  7. POJ 1222 1681 1830 3185 开关灯问题 (高斯消元 异或方程组)

    POJ 1222 EXTENDED LIGHTS OUT 基本的开关灯问题.还保证唯一解. 我们把每一个灯泡当成一个状态xi,总共有30个,而且每个灯与其他灯的关系也很明显.所以我们就可以列30方程3 ...

  8. 高斯消元 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(){ ...

  9. POJ 1830 开关问题 高斯消元

    题意:给你N个开关,其中某些开关之间是相互影响的,即一个开关控制多个,那么每个开关操作与否为一个变元,有N个变元,开关之间相互影响的系数设为1,否则为0,对模2高斯消元求解自由变元个数. #inclu ...

最新文章

  1. javascript实现的有缩略图功能的幻灯片切换效果
  2. Bash中的管道输出和捕获退出状态
  3. python测试之道进阶,Pytest-Mock 进阶用法详解
  4. 12-函数的定义+自调+实参及形参理解
  5. 基于边缘计算的森林火警监测系统
  6. 2012计算机一级考试试题,2012年计算机一级考试试题题库(备考)
  7. 使用frp实现内网穿透
  8. DPDK报文分类与访问控制
  9. python not_刚接触Python,python中not in怎么解释?求解释一下?
  10. 通过Python将不同的附件发给不同的收件人
  11. Qt简单实现UDP通信
  12. div+css实现盖章
  13. 多个excel合并为一个excel的多个sheet
  14. 合生活门禁复制数据结构分析
  15. Linux学习(1):在服务器上与团队共享文件,workgroup这个用户组相关操作命令
  16. 最燃黑客情报官薛锋:端起AK伏特加,代表人民把坏人抓
  17. ERC20重要补充之approveAndCall
  18. 1+1≠2 |A/B 测试中的赢者诅咒
  19. HCIE 面试资料-BFD/NSF/NSR/NTP
  20. unplugin-auto-import的配置和eslint报错解决

热门文章

  1. Springboot工程下使用mybatis反向工程
  2. python程序编程千分符号怎么输入_教你用Python来玩“微信跳一跳”瞬间千分……已开源...
  3. mysql.info文件是什么_info 数据库
  4. 一周一论文(翻译 总结)— [SOCC 14] DaRPC: Data Center RPC 基于RDMA的高性能通信RPC
  5. linux创建更改目录,如何使用Linux中的单个命令创建新目录并更改它 | MOS86
  6. python中变量类型在程序中可以改变_python的可变与不可变数据类型
  7. (转) 共享个很棒的vim配置
  8. 小程序页面遮罩且不能滚动 + 内容居中显示
  9. Metasploit的三种启动方式
  10. -Xms -Xmx -Xmn -Xss -XX: