poj 2065 高斯消元(取模的方程组)
Time Limit: 1000MS | Memory Limit: 30000K | |
Total Submissions: 1735 | Accepted: 1085 |
Description
Recently, it was discovered that if each message is assumed to be transmitted as a sequence of integers a0, a1, ...an-1 the function f (k) = ∑0<=i<=n-1aiki (mod p) always evaluates to values 0 <= f (k) <= 26 for 1
<= k <= n, provided that the correct value of p is used. n is of course the length of the transmitted message, and the ai denote integers such that 0 <= ai < p. p is a prime number that is guaranteed to be larger than n as well as larger than 26.
It is, however, known to never exceed 30 000.
These relationships altogether have been considered too peculiar for being pure coincidences, which calls for further investigation.
The linguists at the faculty of Langues et Cultures Extraterrestres transcribe these messages to strings in the English alphabet to make the messages easier to handle while trying to interpret their meanings. The transcription procedure simply assigns the letters
a..z to the values 1..26 that f (k) might evaluate to, such that 1 = a, 2 = b etc. The value 0 is transcribed to '*' (an asterisk). While transcribing messages, the linguists simply loop from k = 1 to n, and append the character corresponding to the value
of f (k) at the end of the string.
The backward transcription procedure, has however, turned out to be too complex for the linguists to handle by themselves. You are therefore assigned the task of writing a program that converts a set of strings to their corresponding Extra Terrestial number
sequences.
Input
The only allowed characters in the string are the lower case letters 'a'..'z' and '*' (asterisk). No string will be longer than 70 characters.
Output
Sample Input
- 3
- 31 aaa
- 37 abc
- 29 hello*earth
Sample Output
- 1 0 0
- 0 1 0
- 8 13 9 13 4 27 18 10 12 24 15
题意:
表示最开始并没有看懂题目是什么意思,那一串字母代表f[i]的值
f(k) = ∑0<=i<=n-1aiki (mod p)转换成方程组便是,
a0*1^0 + a1*1^1+a2*1^2+........+an-1*1^(n-1) = f(1)
a0*2^0 + a1*2^1+a2*2^2+........+an-1*2^(n-1) = f(2)
......
a0*n^0 + a1*n^1+a2*n^2+........+an-1*n^(n-1) = f(n)
- /*
- poj 2065
- 解对mod取模的方程组
- */
- #include <iostream>
- #include <cstdio>
- #include <cstdlib>
- #include <cstring>
- #include <algorithm>
- #include <cmath>
- using namespace std;
- typedef long long ll;
- typedef long double ld;
- using namespace std;
- const int maxn = 105;
- int equ,var;
- int a[maxn][maxn];
- int b[maxn][maxn];
- int x[maxn];
- int free_x[maxn];
- int free_num;
- int n;
- void debug()
- {
- for(int i = 0; i < n; i++)
- {
- for(int j = 0; j <= n; j++)
- printf("%d ",a[i][j]);
- printf("\n");
- }
- }
- int gcd(int a,int b)
- {
- while(b)
- {
- int tmp = b;
- b = a%b;
- a = tmp;
- }
- return a;
- }
- int lcm(int a,int b)
- {
- return a/gcd(a,b)*b;
- }
- int Gauss(int mod)
- {
- int max_r,col,k;
- free_num = 0;
- for(k = 0,col = 0; k < equ && col < var; k++,col++)
- {
- max_r = k;
- for(int i = k+1; i < equ; i++)
- {
- if(abs(a[i][col]) > abs(a[max_r][col]))
- max_r = i;
- }
- if(a[max_r][col] == 0)
- {
- k --;
- free_x[free_num++] = col;
- continue;
- }
- if(max_r != k)
- {
- for(int j = col; j < var+1; j++)
- swap(a[k][j],a[max_r][j]);
- }
- for(int i = k + 1; i < equ; i++)
- {
- if(a[i][col] != 0)
- {
- 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] < 0) tb = -tb;
- for(int j = col; j < var+1; j++)
- {
- a[i][j] = ((a[i][j]*ta - a[k][j]*tb)%mod+mod)%mod;
- }
- }
- }
- }
- for(int i = k; i < equ; i++)
- if(a[i][col] != 0)
- return -1;
- if(k < var) return var-k;
- for(int i = var-1; i >= 0; i--)
- {
- ll temp = a[i][var];
- for(int j = i +1; j < var; j++)
- temp =((temp- a[i][j]*x[j])%mod+mod)%mod;
- while(temp % a[i][i]) temp += mod;
- temp /= a[i][i];
- temp %= mod;
- x[i] = temp;
- }
- return 0;
- }
- void ini()
- {
- memset(a,0,sizeof(a));
- memset(x,0,sizeof(x));
- equ = n;
- var = n;
- }
- char str[105];
- int main()
- {
- int T,p;
- scanf("%d",&T);
- while(T--)
- {
- scanf("%d",&p);
- scanf("%s",str);
- n = strlen(str);
- ini();
- for(int i=0; i<n; i++)
- {
- if(str[i]=='*')
- a[i][n]=0;
- else
- a[i][n]=str[i]-'a'+1;
- a[i][0]=1;
- for(int j=1; j<n; j++)
- a[i][j]=(a[i][j-1]*(i+1))%p;
- }
- //debug();
- Gauss(p);
- for(int i = 0; i < n-1; i++)
- printf("%d ",x[i]);
- printf("%d\n",x[n-1]);
- }
- return 0;
- }
poj 2065 高斯消元(取模的方程组)的更多相关文章
- POJ 2065 高斯消元求解问题
题目大意: f[k] = ∑a[i]*k^i % p 每一个f[k]的值就是字符串上第 k 个元素映射的值,*代表f[k] = 0 , 字母代表f[k] = str[i]-'a'+1 把每一个k^i求 ...
- 2017湘潭赛 A题 Determinant (高斯消元取模)
链接 http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id/1260 今年湘潭的A题 题意不难 大意是把n*(n+1)矩阵去掉某一列 ...
- POJ 2065 SETI (高斯消元 取模)
题目链接 题意: 输入一个素数p和一个字符串s(只包含小写字母和‘*’),字符串中每个字符对应一个数字,'*'对应0,‘a’对应1,‘b’对应2.... 例如str[] = "abc&quo ...
- 【poj1830-开关问题】高斯消元求解异或方程组
第一道高斯消元题目~ 题目:有N个相同的开关,每个开关都与某些开关有着联系,每当你打开或者关闭某个开关的时候,其他的与此开关相关联的开关也会相应地发生变化,即这些相联系的开关的状态如果原来为开就变为关 ...
- bzoj千题计划187:bzoj1770: [Usaco2009 Nov]lights 燈 (高斯消元解异或方程组+枚举自由元)
http://www.lydsy.com/JudgeOnline/problem.php?id=1770 a[i][j] 表示i对j有影响 高斯消元解异或方程组 然后dfs枚举自由元确定最优解 #in ...
- 【BZOJ】2466: [中山市选2009]树 高斯消元解异或方程组
[题意]给定一棵树的灯,按一次x改变与x距离<=1的点的状态,求全0到全1的最少次数.n<=100. [算法]高斯消元解异或方程组 [题解]设f[i]=0/1表示是否按第i个点的按钮,根据 ...
- POJ SETI 高斯消元 + 费马小定理
http://poj.org/problem?id=2065 题目是要求 如果str[i] = '*'那就是等于0 求这n条方程在%p下的解. 我看了网上的题解说是高斯消元 + 扩展欧几里德. 然后我 ...
- 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:// ...
- POJ 1222 EXTENDED LIGHTS OUT(高斯消元解异或方程组)
EXTENDED LIGHTS OUT Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 10835 Accepted: 6 ...
随机推荐
- *.db-journal 是什么(android sqlite )数据库删除缓存
sqlite的官方文档,发现该文件是sqlite的一个临时的日志文件,主要用于sqlite数据库的事务回滚操作了.在事务开始时产生,在事务操作完毕时自动删除,当程序发生崩溃或一些意外情况让程序非法结束 ...
- initializer element is not a compile-time constant
初始化一个全局变量或static变量时,只能用常量赋值,不能用变量赋值! 如下就会报这个错误(KUIScreenWidth)是变量 static CGFloat const topButtonWidt ...
- OO面向对象课程作业1-3总结
作业一.多项式的加减运算 1.设计要点与自我分析 我设计的类图 老师建议类图 我设计了两个类来进行多项式的计算,类Polynomial进行多项式的存储和输入输出,第二个类进行多项式加减运算.而加减运算 ...
- 让linux远程主机在后台运行脚本
后台挂起:python xxx.py & 在脚本命令后面加入"&"符号就可以后台运行.结束进程:kill -9 sidps -ef | grep ... 查询sid
- Table点击某个td获取当前列的头名称
jq代码: $("td").click(function () { var tdHtml = $(this).attr("html"); var index = ...
- 从微软MVP到女儿开学--2017前半年小结
2017年转眼就到了9月,原本在年初定的计划基本泡汤了. 看书啊减肥啊出教程啊,都被因为各种事物给缠身而没有完成. 1号带女儿去报名的时候,听到老师说"家长们请到这边来集合"的时候 ...
- android studio 何如修改报名
1. 重命名办法,网上很多见 2. 对于需要重新修改包名的级别的 a. 修改package 和 gradle 的包名,对应一致. b. 修改R 所在包名,使用crtl+n修改R文件的路径 c. 手动首 ...
- CountDownLatch与thread-join()的区别
今天学习CountDownLatch这个类,作用感觉和join很像,然后就百度了一下,看了他们之间的区别.所以在此记录一下. 首先来看一下join,在当前线程中,如果调用某个thread的join方法 ...
- ES6关于Promise的用法
Promise 对象用于一个异步操作的最终完成(或失败)及其结果值的表示.简单点说,它就是用于处理异步操作的,异步处理成功了就执行成功的操作,异步处理失败了就捕获错误或者停止后续操作. 它的一般表示形 ...
- 初探Javascript之Canvas
什么是Canvas <canvas>是 HTML5 新增的元素,可使用JavaScript脚本来绘制图形. canvas是一个矩形区域,您可以控制其每一像素. 引入Canvas ```ht ...