【poj2065】 SETI

http://poj.org/problem?id=2065 (题目链接)

题意

  题意半天看不懂。。给你一个素数P(P<=30000)和一串长为n的字符串str[]。字母‘*‘代表0,字母a-z分别代表1-26,这n个字符所代表的数字分别代表f(1)、f(2)....f(n)。定义: ${f(k)=\sum_{i=0}^{n-1}{a_ik^i~(mod~p)}~(1<=k<=n,0<=a_i<P)}$,求a0、a1.....an-1。题目保证肯定有唯一解。

Solution

  直接高斯消元,因为是模方程组所以除的时候求个逆元即可。

代码

// poj2065
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<map>
#define LL long long
#define inf 2147483640
#define Pi acos(-1,0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std;

const int maxn=100;
int a[maxn][maxn],n,P;
char ch[maxn];

int power(int a,int b,int c) {
	int res=1;
	while (b) {
		if (b&1) res=res*a%c;
		b>>=1;a=a*a%c;
	}
	return res;
}
void Gauss() {
	for (int r,i=1;i<=n;i++) {
		r=i;
		for (int j=i+1;j<=n;j++) if (abs(a[r][i])<abs(a[j][i])) r=j;
		if (a[r][i]==0) continue;
		if (r!=i) for (int j=1;j<=n+1;j++) swap(a[i][j],a[r][j]);
		int inv=power(a[i][i],P-2,P);
		for (int j=1;j<=n;j++) if (j!=i) {
				for (int k=n+1;k>=i;k--)
					a[j][k]=(a[j][k]-(a[j][i]*inv)%P*a[i][k]%P+P)%P;
			}
	}
}

int main() {
	int T;scanf("%d",&T);
	while (T--) {
		scanf("%d",&P);
		scanf("%s",ch+1);
		n=strlen(ch+1);
		for (int i=1;i<=n;i++) {
			int tmp=1;
			for (int j=1;j<=n;j++) {
				a[i][j]=tmp;
				tmp=tmp*i%P;
			}
			a[i][n+1]=ch[i]==‘*‘ ? 0 : ch[i]-‘a‘+1;
		}
		Gauss();
		for (int i=1;i<=n;i++) {
			if (a[i][i]==0) {printf("0 ");continue;}
			int inv=power(a[i][i],P-2,P);
			printf("%d ",inv*a[i][n+1]%P);
		}
		puts("");
	}
    return 0;
}

  

时间: 2024-10-17 14:40:43

【poj2065】 SETI的相关文章

【转】对于杭电OJ题目的分类

[好像博客园不能直接转载,所以我复制过来了..] 1001 整数求和 水题1002 C语言实验题——两个数比较 水题1003 1.2.3.4.5... 简单题1004 渊子赛马 排序+贪心的方法归并1005 Hero In Maze 广度搜索1006 Redraiment猜想 数论:容斥定理1007 童年生活二三事 递推题1008 University 简单hash1009 目标柏林 简单模拟题1010 Rails 模拟题(堆栈)1011 Box of Bricks 简单题1012 IMMEDI

【转】POJ题目分类

初级:基本算法:枚举:1753 2965贪心:1328 2109 2586构造:3295模拟:1068 2632 1573 2993 2996图:最短路径:1860 3259 1062 2253 1125 2240最小生成树:1789 2485 1258 3026拓扑排序:1094二分图的最大匹配:3041 3020最大流的增广路算法:1459 3436数据结构:串:1035 3080 1936排序:2388 2299哈希表和二分查找等高效查找法:3349 3274 2151 1840 2002

【转】ACM训练计划

[转] POJ推荐50题以及ACM训练方案 2010-08-21 21:05 转载自 wade_wang 最终编辑 000lzl POJ 推荐50题 第一类 动态规划(至少6题,2479 和 2593 必做) 2479 和 2593 1015 1042(可贪心) 1141 1050 1080 1221 1260 2411(稍难) 1276 第二类 搜索(至少4题) 1011 1033 1129 2049 2056 2488 2492(稍难,也可并查集) 第三类 贪心(至少2题) 1065 205

【状压DP】【UVA11825】 Hackers&#39; Crackdown

传送门 Description 你是一个hacker,侵入了一个有着n台计算机(编号为1.2.3....n)的网络.一共有n种服务,每台计算机都运行着所有服务.对于每台计算机,你都可以选择一项服务,终止这台计算机和所有与它相邻计算机的该项服务(如果其中一些服务已经停止,那他们继续保持停止状态).你的目标是让尽量多的服务完全瘫痪 Input 输入包含多组数据,每组数据中: 第一行为整数n: 以下n行每行描述一台计算机相邻的计算机, 其中第一个数m为相邻计算机个数,接下来的m个整数为这些计算机的编号

【Kettle】4、SQL SERVER到SQL SERVER数据转换抽取实例

1.系统版本信息 System:Windows旗舰版 Service Pack1 Kettle版本:6.1.0.1-196 JDK版本:1.8.0_72 2.连接数据库 本次实例连接数据库时使用全局变量. 2.1 创建新转换:spoon启动后,点击Ctrl+N创建新转换 2.2 在新转换界面中,右键点击DB连接,系统会弹出[数据库连接]界面. windows系统环境下,可用${}获取变量的内容. 说明: 连接名称:配置数据源使用名称.(必填) 主机名称:数据库主机IP地址,此处演示使用本地IP(

详解go语言的array和slice 【二】

上一篇  详解go语言的array和slice [一]已经讲解过,array和slice的一些基本用法,使用array和slice时需要注意的地方,特别是slice需要注意的地方比较多.上一篇的最后讲解到创建新的slice时使用第三个索引来限制slice的容量,在操作新slice时,如果新slice的容量大于长度时,添加新元素依然后使源的相应元素改变.这一篇里我会讲解到如何避免这些问题,以及迭代.和做为方法参数方面的知识点. slice的长度和容量设置为同一个值 如果在创建新的slice时我们把

【转载】C++拷贝构造函数(深拷贝,浅拷贝)

对于普通类型的对象来说,它们之间的复制是很简单的,例如:int a=88;int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量.下面看一个类对象拷贝的简单例子. #include <iostream>using namespace std;class CExample {private:     int a;public:     CExample(int b)     { a=b;}     void Show ()     {        cout<

【BZOJ】1799: [Ahoi2009]self 同类分布

[题意]给出a,b,求出[a,b]中各位数字之和能整除原数的数的个数.1 ≤ a ≤ b ≤ 10^18 [算法]数位DP [题解] 感觉这种方法很暴力啊. 枚举数位和1~162(不能枚举0,不然会模0,相当于除0),记忆化f[pos][sum][val],sum表示当前数位和,val表示数字取模枚举的数位和. 每次sum+i和(val*10+i)%MOD转移. sum用减法优化,即记忆化(MOD-sum),但是枚举过程中都要memset,导致效率低下,记忆化效果很差. 要什么方法才能跑1.3s

【BZOJ4942】[Noi2017]整数 线段树+DFS(卡过)

[BZOJ4942][Noi2017]整数 题目描述去uoj 题解:如果只有加法,那么直接暴力即可...(因为1的数量最多nlogn个) 先考虑加法,比较显然的做法就是将A二进制分解成log位,然后依次更新这log位,如果最高位依然有进位,那么找到最高位后面的第一个0,将中间的所有1变成0,那个0变成1.这个显然要用到线段树,但是复杂度是nlog2n的,肯定过不去. 于是我在考场上yy了一下,这log位是连续的,我们每次都要花费log的时间去修改一个岂不是很浪费?我们可以先在线段树上找到这段区间