题目大意:

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. JS 九宫格算法 用原生js实现

    九宫格算法核心: 利用控件索引index计算出控件所在的行数和列数: 利用控件计算出left距离: 利用控件计算出top距离: 写特效时需要用到定位 公式: 行 row=parseInt(i/cols ...

  2. mysql插入二千万的测试数据进行测试,int和datetime比较

    时间存储用int和datetime哪个字段更合适,建立下面的两个表 测试环境是内存2个G,一核的虚拟机 CREATE TABLE `test_inttime` ( `id` int(11) NOT N ...

  3. Kali linux 2016.2(Rolling)安装之后的常用配置

    前言 使用默认的Kali Linux设置来学习是可以的,但是我们通常要修改系统的一些基本设置,来最大化使用Kali平台的功能. 以下内容 网络的基础知识 使用图形用户界面来配置网卡 使用命令行来配置网 ...

  4. 6.12---Swagger中paramType---swagger的RequestParam和ApiImpliciParam----Example中方法带有selective

    paramType:表示参数放在哪个地方    header-->请求参数的获取:@RequestHeader(代码中接收注解)    query-->请求参数的获取:@RequestPa ...

  5. Android 百度地图 android.view.InflateException: Binary XML file line Error inflating class com.baidu.mapapi.map.MapView

    android.view.InflateException: Binary XML file line Error inflating class com.baidu.mapapi.map.MapVi ...

  6. 自定义样式 dialog

    自定义样式 dialog,可设置界面外点击屏幕外和返回键  是否消失 基本用法如下: CustomDialog.Builder customBuilder = new CustomDialog.Bui ...

  7. Farseer.net轻量级开源框架 中级篇:动态数据库访问

    导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 中级篇: 自定义配置文件 下一篇:Farseer.net轻量级开源框架 中级篇: 数据库切换 ...

  8. swift VS NSObject

    Any class that does not inherit from another class is known as a base class. Swift classes do not in ...

  9. RocketMQ学习笔记(16)----RocketMQ搭建双主双从(异步复制)集群

    1. 修改RocketMQ默认启动端口 由于只有两台机器,部署双主双从需要四个节点,所以只能修改rocketmq的默认启动端口,从官网下载rocketmq的source文件,解压后使用idea打开,全 ...

  10. vue的自定义指令控制菜单权限

    用户登录后,选择子节点,节点中含有多个菜单,可以根据后台返回的权限数据进行权限控制 在vue上挂载自定义指令方法,根据后台返回权限移除相应节点 import Cookies from "js ...