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的矩阵代表当前状态,求一个能全部使灯灭的 ...
随机推荐
- bzoj 3743: [Coci2015]Kamp【树形dp】
两遍dfs一遍向下,一边向上,分别记录子树内人数a,当前点到所有点的距离b,最大值c和次大值d,最大值子树p 然后答案是2b-c #include<iostream> #include&l ...
- Akka源码分析-Akka-Streams-Materializer(1)
本博客逐步分析Akka Streams的源码,当然必须循序渐进,且估计会分很多篇,毕竟Akka Streams还是比较复杂的. implicit val system = ActorSystem(&q ...
- spring cloud config搭建说明例子(二)-添加eureka
添加注册eureka 服务端 ConfigServer pom.xml <dependency> <groupId>org.springframework.cloud</ ...
- redis的两种备份方式
Redis提供了两种持久化选项,分别是RDB和AOF. 默认情况下60秒刷新到disk一次[save 60 10000 当有1w条keys数据被改变时],Redis的数据集保存在叫dump.rdb一个 ...
- MongoDB学习笔记~复杂条件拼接和正则的使用
在大叔lind框架里有日志组件logger,而在日志实现方式上有file,mongodb,sql,json等方式,对分布式日志处理上大叔推荐使用mongodb进行存储,除了它的高效写入,灵活的结构外, ...
- Ajax动态加载数据
前言: 1.这个随笔实现了一个Ajax动态加载的例子. 2.使用.net 的MVC框架实现. 3.这个例子重点在前后台交互,其它略写. 开始: 1.控制器ActionResult代码(用于显示页面) ...
- log4j2异步日志解读(一)AsyncAppender
log4j.logback.log4j2 历史和关系,我们就在这里不展开讲了.直接上干货,log4j2突出于其他日志的优势,异步日志实现. 看一个东西,首先看官网文档 ,因为前面文章已经讲解了disr ...
- Java高级程序员(5年左右)面试的题目集
Java高级程序员(5年左右)面试的题目集 https://blog.csdn.net/fangqun663775/article/details/73614850?utm_source=blogxg ...
- 树莓派zero_w设置中文(已成功)
树莓派默认是采用英文字库的,而且系统里没有预装中文字库,所以即使你在locale中改成中文,也不会显示中文,只会显示一堆方块.因此需要我们手动来安装中文字体. 好在有一个中文字体是免费开源使用的.ss ...
- POJ_3565_Ants
题意:给出N个白点和N个黑点,要求用N条不相交的线段把它们连接起来,其中每条线段恰好连接一个白点和一个黑点,每个点恰好连接到一条线段. 分析:因为有结点黑白两色,我们不难想到构造一个二分图,其中每个白 ...