POJ 2065 高斯消元求解问题
题目大意:
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 高斯消元求解问题的更多相关文章
- poj 2065 高斯消元(取模的方程组)
SETI Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 1735 Accepted: 1085 Description ...
- 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:// ...
- 【poj2947】高斯消元求解同模方程组【没有AC,存代码】
题意: p start enda1,a2......ap (1<=ai<=n)第一行表示从星期start 到星期end 一共生产了p 件装饰物(工作的天数为end-start+1+7*x, ...
- 【zoj3645】高斯消元求解普通线性方程
题意: 给你一个方程组(含有12个方程),求(x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11) 方程组的形式是一个二次方程组 (ai1-x1)^2 + (ai2-x2)^2 +( ...
- 【poj1830-开关问题】高斯消元求解异或方程组
第一道高斯消元题目~ 题目:有N个相同的开关,每个开关都与某些开关有着联系,每当你打开或者关闭某个开关的时候,其他的与此开关相关联的开关也会相应地发生变化,即这些相联系的开关的状态如果原来为开就变为关 ...
- POJ 1830 开关问题(高斯消元求解的情况)
开关问题 Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 8714 Accepted: 3424 Description ...
- POJ SETI 高斯消元 + 费马小定理
http://poj.org/problem?id=2065 题目是要求 如果str[i] = '*'那就是等于0 求这n条方程在%p下的解. 我看了网上的题解说是高斯消元 + 扩展欧几里德. 然后我 ...
- *POJ 1222 高斯消元
EXTENDED LIGHTS OUT Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 9612 Accepted: 62 ...
- POJ 1222 高斯消元更稳
大致题意: 有5*6个灯,每个灯只有亮和灭两种状态,分别用1和0表示.按下一盏灯的按钮,这盏灯包括它周围的四盏灯都会改变状态,0变成1,1变成0.现在给出5*6的矩阵代表当前状态,求一个能全部使灯灭的 ...
随机推荐
- easyui-datebox 年月视图显示
//年月视图做法 $('#startYearDate').datebox({ onShowPanel: function () { //显示日趋选择对象后再触发弹出月份层的事件,初始化时没有生成月份层 ...
- JS 实现PDF文件打印
function PdfPrint() { bdhtml = window.document.body.innerHTML; sprnstr = "<!-- ...
- 【IIS7.5】Asp文件上传限制,加载页面大小限制
运行环境 window server 2008 R2 X64.IIS7.5.应用程序池.Net4.0 经典模式 分析 IIS7.5默认有两处上传限制: 第一处在,选择左侧的站点,然后找到后侧的管理—— ...
- esp8266 SOC方案经过半年沉淀之后再度重启二
2018-08-2014:16:10 以下是输出控制 PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO0_U, FUNC_GPIO0); GPIO_OUTPUT_SET ...
- Linux学习笔记之Linux命令
1. blkid 查看当前系统中所有已挂载文件系统的类型
- echarts之我用
最近在用echarts做项目,抽点时间总结一下. 首先说一下什么是echarts.echarts是百度开发的类似于fusioncharts的图表展示控件.区别于fusioncharts的是echart ...
- POJ_2536_Gopher II
题意:n只地鼠,m个地鼠洞,地鼠必须以v的速度在s秒内钻进洞且每个洞仅能容纳一只地鼠,问最少有几只地鼠会被老鹰吃掉. 分析:最大匹配问题,将s秒内地鼠能够跑到的洞与该地鼠连成一条边,在最后得到的图中使 ...
- Exceptions & Errors - 异常与错误
来源于 Ry’s Objective-C Tutorial - RyPress 一个学习Objective-C基础知识的网站. 个人觉得很棒,所以决定抽时间把章节翻译一下. 本人的英语水平有限,有让大 ...
- Masonry基础API
Masonry基础API mas_makeConstraints() 添加约束 mas_remakeConstraints() 移除之前的约束,重新添加新的约束 mas_updateConst ...
- 观察者模式在Foundation框架通知中的应用
GitHub传送门 1.何为观察者模式? 观察者设计模式定义了对象间的一种一对多的依赖关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新. 举个简单的例子:你和你的舍友都订阅了 ...