题目大意:

f[k] = ∑a[i]*k^i % p

每一个f[k]的值就是字符串上第 k 个元素映射的值,*代表f[k] = 0 , 字母代表f[k] = str[i]-'a'+1

把每一个k^i求出保存在矩阵中,根据字符串的长度len,那么就可以得到len行的矩阵,利用高斯消元解决这个线性方程组

 #include <cstdio>
#include <cstring>
#include <iostream>
using namespace std; const int N = ;
//a[i][j]表示线性方程组形成的矩阵上的第i行第j个元素
//x[]保存线性方程组的解集
int a[N][N] , p , x[N];
char str[N]; //求取模的幂运算 x^y % mod
int pow(int x , int y , int mod)
{
int ans = ;
while(y){
if(y & ){
ans *= x;
ans %= mod;
}
x *= x;
x %= mod;
y>>=;
}
return ans;
} int gcd(int a , int b)
{
if(b == ) return a;
else return gcd(b , a%b);
} int lcm(int a , int b)
{
return a/gcd(a , b)*b;//先除后乘防止溢出
} inline int my_abs(int x)
{
return x>=?x:-x;
} inline void my_swap(int &a , int &b)
{
int tmp = a;
a = b , b = tmp;
}
/*
高斯消元解线性方程组的解
有equ个方程,var个变元。增广矩阵行数为equ,分别为0到equ-1,列数为var+1,分别为0到var
总是考虑上三角部分,所以内部更新总是只更新了上三角部分
*/
int gauss(int equ , int var , int mod)
{
int max_r; // 当前这列绝对值最大的行
int col; // 当前处理的列
int ta , tb;
int Lcm , tmp; for(int i= ; i<var ; i++)
x[i] = ; //转化为阶梯形矩阵
col = ;//一开始处理到第0列
for(int k= ; k<equ ; k++,col++){
/*
枚举当前处理的行
找到该行col列元素绝对值最大的那行与第k行交换,
这样进行除法运算的时候就可以避免小数除以大数了
*/
max_r = k;
for(int i = k+ ; i<equ ; i++)
if(my_abs(a[i][col]) > my_abs(a[max_r][col]))
max_r = i;
if(max_r != k){
//交换两行的数据
for(int i=k ; i<var+ ; i++)
my_swap(a[max_r][i] , a[k][i]);
} if(a[k][col] == ){
//说明该col列第k行以下全是0了,则处理当前行的下一列
k--;
continue;
} for(int i=k+ ; i<equ ; i++){
//枚举要删去的行
if(a[i][col] != ){
Lcm = lcm(my_abs(a[i][col]) , my_abs(a[k][col]));
ta = Lcm / my_abs(a[i][col]);
tb = Lcm / my_abs(a[k][col]);
if(a[i][col] * a[k][col] < ) tb = -tb;//异号相加
for(int j = col ; j<var+ ; j++)
a[i][j] = ((a[i][j]*ta)%mod - (a[k][j]*tb)%mod + mod) % mod;
}
}
}
//唯一解的情况:在var*(var+1) 的增广矩阵中形成严格的上三角阵
//计算x[n-1] , x[n-2] .... x[0] 回代计算,先得到后面的值,推到前面的值
for(int i=var- ; i>= ; i--){
tmp = a[i][var];
for(int j=i+ ; j<var ; j++){
if(a[i][j] != ) tmp -= a[i][j]*x[j];
tmp = (tmp%mod+mod)%mod;
}
while(tmp%a[i][i])
tmp+=mod;
x[i] = (tmp / a[i][i])%mod;
}
return ;
} int main()
{
// freopen("a.in" , "r" , stdin);
int T;
scanf("%d" , &T);
while(T--)
{
scanf("%d%s" , &p , str);
int len = strlen(str);
//填写矩阵中的元素
for(int i= ; i<len ; i++){
if(str[i] == '*') a[i][len] = ;
else a[i][len] = (int)(str[i] - 'a' + );
for(int j= ; j<len ; j++)
a[i][j] = pow(i+ , j , p);
}
gauss(len , len , p);
for(int i= ; i<len ; i++){
if(i == ) printf("%d" , x[i]);
else printf(" %d" , x[i]);
}
puts("");
}
return ;
}

POJ 2065 高斯消元求解问题的更多相关文章

  1. poj 2065 高斯消元(取模的方程组)

    SETI Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 1735   Accepted: 1085 Description ...

  2. POJ 1222 POJ 1830 POJ 1681 POJ 1753 POJ 3185 高斯消元求解一类开关问题

    http://poj.org/problem?id=1222 http://poj.org/problem?id=1830 http://poj.org/problem?id=1681 http:// ...

  3. 【poj2947】高斯消元求解同模方程组【没有AC,存代码】

    题意: p start enda1,a2......ap (1<=ai<=n)第一行表示从星期start 到星期end 一共生产了p 件装饰物(工作的天数为end-start+1+7*x, ...

  4. 【zoj3645】高斯消元求解普通线性方程

    题意: 给你一个方程组(含有12个方程),求(x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11) 方程组的形式是一个二次方程组 (ai1-x1)^2 + (ai2-x2)^2 +( ...

  5. 【poj1830-开关问题】高斯消元求解异或方程组

    第一道高斯消元题目~ 题目:有N个相同的开关,每个开关都与某些开关有着联系,每当你打开或者关闭某个开关的时候,其他的与此开关相关联的开关也会相应地发生变化,即这些相联系的开关的状态如果原来为开就变为关 ...

  6. POJ 1830 开关问题(高斯消元求解的情况)

    开关问题 Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 8714   Accepted: 3424 Description ...

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

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

  8. *POJ 1222 高斯消元

    EXTENDED LIGHTS OUT Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 9612   Accepted: 62 ...

  9. POJ 1222 高斯消元更稳

    大致题意: 有5*6个灯,每个灯只有亮和灭两种状态,分别用1和0表示.按下一盏灯的按钮,这盏灯包括它周围的四盏灯都会改变状态,0变成1,1变成0.现在给出5*6的矩阵代表当前状态,求一个能全部使灯灭的 ...

随机推荐

  1. Android框架式编程之EasyPermissions

    EasyPermission库是一个谷歌官方提供的简化基本的系统权限逻辑的库,可用于在Android M或者更高版本上. 官方项目地址:https://github.com/googlesamples ...

  2. Selct 大全

    添加option $("#ID option").each(function(){ if($(this).val()==111){ $(this).remove(); } }); ...

  3. Asp.NET 知识点总结(一)

    1.简述 private. protected. public. internal 修饰符的访问权限. 答 . private : 私有类,私有成员, 在类的内部才可以访问. protected : ...

  4. 二分图最大匹配(匈牙利算法) POJ 3020 Antenna Placement

    题目传送门 /* 题意:*的点占据后能顺带占据四个方向的一个*,问最少要占据多少个 匈牙利算法:按坐标奇偶性把*分为两个集合,那么除了匹配的其中一方是顺带占据外,其他都要占据 */ #include ...

  5. EditText(8)EditText中drawableRight图片的点击事件

    参考: http://stackoverflow.com/questions/3554377/handling-click-events-on-a-drawable-within-an-edittex ...

  6. 《从Paxos到ZooKeeper 分布式一致性原理与实践》阅读【Watcher】

    ZooKeeper 允许客户端向服务端注册一个 Watcher 监听,当服务端的一些指定事件触发了这个 Watcher,那么就会向指定客户端发送一个事件通知来实现分布式的通知功能. ZooKeeper ...

  7. Spark学习之RDD编程(2)

    Spark学习之RDD编程(2) 1. Spark中的RDD是一个不可变的分布式对象集合. 2. 在Spark中数据的操作不外乎创建RDD.转化已有的RDD以及调用RDD操作进行求值. 3. 创建RD ...

  8. opencv3+python+pycharm报错问题(cmd命令正常)

    2018-03-0223:58:59 首先在你已成功安装python的情况下运行cmd命令,下载安装opencv插件 如果在命令行可以使用 import cv2 但是在IDE上面只输入import c ...

  9. 联想 P70-t 免解锁BL 免rec Magisk Xposed 救砖 ROOT

    >>>重点介绍<<< 第一:本刷机包可卡刷可线刷,刷机包比较大的原因是采用同时兼容卡刷和线刷的格式,所以比较大第二:[卡刷方法]卡刷不要解压刷机包,直接传入手机后用 ...

  10. 全3D模具设计自动化解決方案