(a1 * 1^0  +   a2 * 1^1  + ...  an * 1^n - 1) % P = f1

....

(a1 * n^0  +   a2 * n^1  + ...  an - 1 * n ^ n - 1) % P = fn

消元中A[k][i] % A[i][i]不为0时将A[k][i]变为他们的最小公倍数,即整行都乘上lcm(A[k][i], A[i][i]) / A[k][i](不过后来看题解发现有更巧妙的方法不用求lcm),回代求解时使用逆元

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
#include<map>
#include<queue>
#include<vector>
#include<cmath>
#include<utility>
using namespace std;
typedef long long LL;
const int N = 100, INF = 0x3F3F3F3F; int hs[256];
int inv[50000];
int p;
LL a[N][N]; template<typename T>
T gcd(T a, T b){
while(b){
T t = a % b;
a = b;
b = t;
}
return a;
}
template<typename T>
T lcm(T a, T b){
return a / gcd(a, b) * b;
} template<typename T>
void gauss_jordan(T A[N][N], int n){
for(int i = 0; i < n; i++){
//选择一行r与第i行交换
int r = i;
for(int j = i; j < n; j++){
if(A[j][i]){
r = j;
break;
}
}
if(A[r][i] == 0){
continue;
} if(r != i){
for(int j = 0; j <= n; j++){
swap(A[r][j], A[i][j]);
}
}
for(int k = i + 1; k < n; k++){
if(A[k][i]){
if(A[k][i] % A[i][i]){
T d = lcm(A[k][i], A[i][i]) / A[k][i];
for(int j = i; j <= n; j++){
A[k][j] *= d;
}
}
T d = A[k][i] / A[i][i] % p;
for(int j = n; j >= i; j--){
A[k][j] -= d * A[i][j] % p;
A[k][j] = (A[k][j] % p + p) % p;
}
}
}
}
for(int i = n - 1; i >= 0; i--){
for(int j = i + 1; j < n; j++){
A[i][n] -= A[j][n] * A[i][j] % p;
A[i][n] = (A[i][n] % p + p) % p;
}
A[i][n] = A[i][n] * inv[A[i][i] % p] % p;
}
} char str[N];
int main(){
memset(hs, 0, sizeof(hs));
hs['*'] = 0;
for(int i = 0; i < 26; i++){
hs[i + 'a'] = i + 1;
}
int t;
cin>>t;
while(t--){
int n;
cin>>p;
cin>>str;
inv[1] = 1;
for(int i = 2; i < p; i++){
inv[i] = (p - p / i ) * inv[p % i] % p;
}
n = strlen(str);
memset(a, 0, sizeof(a));
for(int i = 0; i < n; i++){
a[i][n] = hs[str[i]];
a[i][0] = 1;
for(int j = 1; j < n; j++){
a[i][j] = a[i][j - 1] * (i + 1) % p;
}
}
gauss_jordan(a, n);
cout<<a[0][n];
for(int i = 1; i < n; i++){
cout<<' '<<a[i][n];
}
cout<<endl;
} return 0;
}

  

POJ2065 SETI(高斯消元 同模方程)的更多相关文章

  1. POJ2065 SETI 高斯消元

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - POJ2065 题意概括 多组数据,首先输入一个T表示数据组数,然后,每次输入一个质数,表示模数,然后,给出一 ...

  2. poj 2065 SETI 高斯消元

    看题就知道要使用高斯消元求解! 代码如下: #include<iostream> #include<algorithm> #include<iomanip> #in ...

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

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

  4. POJ.2065.SETI(高斯消元 模线性方程组)

    题目链接 \(Description\) 求\(A_0,A_1,A_2,\cdots,A_{n-1}\),满足 \[A_0*1^0+A_1*1^1+\ldots+A_{n-1}*1^{n-1}\equ ...

  5. POJ SETI 高斯消元 + 费马小定理

    http://poj.org/problem?id=2065 题目是要求 如果str[i] = '*'那就是等于0 求这n条方程在%p下的解. 我看了网上的题解说是高斯消元 + 扩展欧几里德. 然后我 ...

  6. UVA 1563 - SETI (高斯消元+逆元)

    UVA 1563 - SETI option=com_onlinejudge&Itemid=8&page=show_problem&category=520&probl ...

  7. POJ 2065 SETI 高斯消元解线性同余方程

    题意: 给出mod的大小,以及一个不大于70长度的字符串.每个字符代表一个数字,且为矩阵的增广列.系数矩阵如下 1^0 * a0 + 1^1 * a1 + ... + 1^(n-1) * an-1 = ...

  8. HDU3571 N-dimensional Sphere(高斯消元 同模方程)

    每个点到中心距离相等,以第0个点为参考,其他n个点到中心距等于点0到中心距,故可列n个方程 列出等式后二次未知数相消,得到线性方程组 将每个数加上1e17,求答案是再减去,求解时对一个2 * (1e1 ...

  9. POJ 2065 SETI (高斯消元 取模)

    题目链接 题意: 输入一个素数p和一个字符串s(只包含小写字母和‘*’),字符串中每个字符对应一个数字,'*'对应0,‘a’对应1,‘b’对应2.... 例如str[] = "abc&quo ...

随机推荐

  1. hustoj1353 节点选择 树形dp

    1353: 结点选择 时间限制: 1 Sec  内存限制: 128 MB提交: 6  解决: 2[提交][状态][讨论版] 题目描述 问题描述 有一棵 n 个节点的树,树上每个节点都有一个正整数权值. ...

  2. 1.4---字符串空格变成20%(CC150)

    import CtCILibrary.AssortedMethods; public class Question { // Assume string has sufficient free spa ...

  3. Linux的IO性能监控工具iostat详解

    Linux系统出现了性能问题,一般我们可以通过top.iostat.free.vmstat等命令来查看初步定位问题.其中iostat可以提供更丰富的IO性能状态数据. . 基本使用 $iostat - ...

  4. PHP的反射类ReflectionClass、ReflectionMethod使用实例

    PHP5 具有完整的反射API,添加对类.接口.函数.方法和扩展进行反向工程的能力. 反射是什么? 它是指在PHP运行状态中,扩展分析PHP程序,导出或提取出关于类.方法.属性.参数等的详细信息,包括 ...

  5. Redis提供的持久化机制(RDB和AOF)

    Redis提供的持久化机制 Redis是一种面向"key-value"类型数据的分布式NoSQL数据库系统,具有高性能.持久存储.适应高并发应用场景等优势.它虽然起步较晚,但发展却 ...

  6. Frog Jump

    A frog is crossing a river. The river is divided into x units and at each unit there may or may not ...

  7. python之errno

    http://www.cnblogs.com/Security-Darren/p/4168392.html errno.EWOULDBLOCK 操作将会阻塞

  8. STL vector按多字段值排序

    #include <iostream> #include <vector> #include <string> #include <algorithm> ...

  9. Python自动化运维工具fabric的安装

    使用shell命令进行复杂的运维时,代码往往变得复杂难懂,而使用python脚本语言来编写运维程序,就相当于开发普通的应用一样,所以维护和扩展都比较简单,更重要的是python运维工具fabric能自 ...

  10. springMVC中ajax的使用

    springMVC中使用ajax有两种方法,第一种是根据servletAPI来使用ajax,第二种是根据springMVC给我们提供的API来使用. 一.根据servletAPI: springMVC ...