[Gauss]POJ2065 SETI
题意: *代表0,a-z代表1-26
题目第三行给了一个公式 f (k) = $\sum\limits_{i=0}^{n-1} a_i k^i \pmod{P}$ {f(i)是输入的一串字符串中第i的字母代表的数 $a_i$即$x_i$是要求的 p是输入给的}
然后列出len个方程 用Gauss求解就好了
这题保证有唯一解 因此不必考虑无解或自由未知量
int mod;
LL quick(LL a, LL b)
{
LL ans=;
while(b)
{
if(b & )ans=(ans*a)%mod;
a=(a*a)%mod;
b>>=;
}
return ans%mod;
}
int gcd(int a, int b)
{
return b==? a:gcd(b, a%b);
}
int lcm(int a, int b)
{
return a/gcd(a, b)*b;
}
void ex_gcd(int a, int b, int &x, int &y)
{
if(b)
{
ex_gcd(b, a%b, x, y);
int tmp=x;
x=y;
y=tmp-(a/b)*y;
}
else
{
x=, y=;
return ;
}
} int a[][]; // 增广矩阵
int x[]; // 解
int free_x[]; // 标记是否为自由未知量 void Gauss(int n, int m) // n个方程 m个未知数 即 n行m+1列
{
//转换为阶梯形式
int col=, k, num=;
for(k=; k<n && col<m; k++, col++)
{
//枚举行
int max_r=k;
for(int i=k+; i<n; i++) //找到第col列元素绝对值最大的那行与第k行交换
if(abs(a[i][col])>abs(a[max_r][col]))
max_r=i;
if(max_r!=k)// 与第k行交换
for(int j=col; j<m+; j++)
swap(a[k][j], a[max_r][j]);
if(!a[k][col])// 说明该col列第k行以下全是0了
{
k--;
free_x[num++]=col;
continue;
}
for(int i=k+; i<n; i++) // 枚举要删除的行
if(a[i][col])
{
int LCM=lcm(abs(a[i][col]), abs(a[k][col]));
int ta=LCM/abs(a[i][col]);
int tb=LCM/abs(a[k][col]);
if(a[i][col]*a[k][col]<)
tb=-tb;
for(int j=col; j<m+; j++)
a[i][j]=((a[i][j]*ta-a[k][j]*tb)%mod+mod)%mod;
}
} for(int i=k; i<n; i++)
if(a[i][col])
return ; // 无解 if(k<m) //m-k为自由未知量个数
return ; // 唯一解 回代
for(int i=m-; i>=; i--)
{
int tmp=a[i][m];
for(int j=i+; j<m; j++)
{
if(a[i][j])
tmp-=a[i][j]*x[j];
tmp=(tmp%mod+mod)%mod;
}
int xx, yy;
ex_gcd(a[i][i], mod, xx, yy);
xx=(xx%mod+mod)%mod;
x[i]=(tmp*xx)%mod;
}
return ;
} void init()
{
memset(a, , sizeof(a));
memset(x, , sizeof(x));
} char s[];
int main()
{
int T;
while(~scanf("%d", &T))
while(T--)
{
init();
scanf("%d%s", &mod, s);
int n=strlen(s);
for(int i=; i<n; i++)
{
a[i][n]=(s[i]=='*'? :s[i]-'a'+);
for(int j=; j<n; j++)
a[i][j]=quick(i+, j);
}
Gauss(n, n);
for(int i=; i<n; i++)
{
printf("%d", x[i]);
if(i==n-)
printf("\n");
else
printf(" ");
}
}
return ;
}
POJ 2065
[Gauss]POJ2065 SETI的更多相关文章
- POJ2065 SETI 高斯消元
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - POJ2065 题意概括 多组数据,首先输入一个T表示数据组数,然后,每次输入一个质数,表示模数,然后,给出一 ...
- POJ2065 SETI(高斯消元 同模方程)
(a1 * 1^0 + a2 * 1^1 + ... an * 1^n - 1) % P = f1 .... (a1 * n^0 + a2 * n^1 + ... an - 1 * ...
- poj2065 SETI
题目描述: 多组数据,每次给出一个模数$p$和一个表示答案的字符串, 相当于给出一个方程组:$$a_1*1^{1}+a_2*1^{2}+……+a_n*1^{n}=f_1$$ $$a_1*2^{1}+a ...
- 【poj2065】 SETI
http://poj.org/problem?id=2065 (题目链接) 题意 题意半天看不懂..给你一个素数P(P<=30000)和一串长为n的字符串str[].字母'*'代表0,字母a-z ...
- 高斯消元法(Gauss Elimination)【超详解&模板】
高斯消元法,是线性代数中的一个算法,可用来求解线性方程组,并可以求出矩阵的秩,以及求出可逆方阵的逆矩阵.高斯消元法的原理是:若用初等行变换将增广矩阵 化为 ,则AX = B与CX = D是同解方程组. ...
- UVA 1563 - SETI (高斯消元+逆元)
UVA 1563 - SETI option=com_onlinejudge&Itemid=8&page=show_problem&category=520&probl ...
- 高斯消元几道入门题总结POJ1222&&POJ1681&&POJ1830&&POJ2065&&POJ3185
最近在搞高斯消元,反正这些题要么是我击败了它们,要么就是这些题把我给击败了.现在高斯消元专题部分还有很多题,先把几道很简单的入门题总结一下吧. 专题:http://acm.hust.edu.cn/vj ...
- POJ_2065 SETI 【同余高斯消元】
一.题目 SETI 二.分析 给定一个模数,一串字符串,字符串长度为N,相当于是N个方程的答案,而这N个方程中有N个未知数,要求的就是这N个未知数的值,很显然的高斯消元,遇到模数和除法,用逆元就好. ...
- OPEN CASCADE Gauss Least Square
OPEN CASCADE Gauss Least Square eryar@163.com Abstract. The least square can be used to solve a set ...
随机推荐
- JAXB - Annotations, The Annotation XmlElement
The basic annotation for a field that's intended to be an element is XmlElement. It permits you to d ...
- Memcached 工作原理
http://hzp.iteye.com/blog/1872664 Memcached处理的原子是每一个(key,value)对(以下简称kv对),key会通过一个hash算法转化成hash-key, ...
- pdf压缩之GSview
今天实验室一个同学在网上投简历,网站要求投稿的简历pdf文件必须在100K以内.简历用的是ModernCV的模板,无论如何设置都在160k左右. 尝试用acrobat的压缩功能,也不能保证在100K以 ...
- java多线程总结五:线程池的原理及实现
1.线程池简介: 多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力. 假设一个服务器完成一项任务所需时间为:T1 创 ...
- IOS 应用程序启动加载过程(从点击图标到界面显示)
今天帮同事解决问题的时候发现,程序BUG是由加载过程引起的.所以当局部代码没有问题,但是程序一运行却总不是我们想要结果的时候,我们应该想想是不是因为我们忽略了试图加载过程的原因.下面我们用一个例子来简 ...
- 一篇关于学C++的感想(拿来与大家分享)
学计算机的如果你有耐心看下去,我敢保证这绝对是一种收获 期待爱 大师提醒: 计算机专业不是学编程,而是懂得计算机的工作原理,以及和计算机相关的学科技术.一个高手不必懂得编程,coder是最底层的人物, ...
- DLL详解及Denpendcy Walker的使用
下面的文章被N次转载,为了尊重原作,\(^o^)/~,贴出最早发布这篇文章的地址及作者. 动态链接库 Windows的活动大陆 2006-07-26 09:21 作者:狂ρκ来源:电脑爱好者 在 ...
- OpenJudge 2802 小游戏 / Poj 1101 The Game
1.链接地址: http://bailian.openjudge.cn/practice/2802 http://poj.org/problem?id=1101 2.题目: 总时间限制: 1000ms ...
- 【HeadFirst设计模式】11.代理模式
定义: 为另一个对象提供一个替身或占位符以访问这个对象. 远程代理 虚拟代理 保护代理.动态代理 其它: 远程代理的远程接口必须继承记号接口Remote 远程代理的使用过程中,要注意序列化的问题, 远 ...
- DataTable 数据量大时,导致内存溢出的解决方案
/// <summary> /// 分解数据表 /// </summary> /// <param name="originalTab">需要分 ...