POJ 2065 SETI (高斯消元 取模)
题意:
输入一个素数p和一个字符串s(只包含小写字母和‘*’),字符串中每个字符对应一个数字,'*'对应0,‘a’对应1,‘b’对应2....
例如str[] = "abc", 那么说明 n=3, 字符串所对应的数列为1, 2, 3。
题目中定义了一个函数:
a0*1^0 + a1*1^1+a2*1^2+........+an-1*1^(n-1) = f(1)(mod p), f(1) = str[0] = a = 1;
a0*2^0 + a1*2^1+a2*2^2+........+an-1*2^(n-1) = f(2) (mod p) , f(2) = str[1] = b = 2;
..........
a0*n^0 + a1*n^1+a2*n^2+........+an-1*n^(n-1) = f(n) (mod p) ,f(n) = str[n-1] = ````
求出 a0,a1,a2....an-1.
感谢大神翻译。
分析:
除了题意有点难懂以外,没有什么,就是给了一个一个含有n个方程n个未知数的线性方程组,让求解。
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <cstdlib>
- #include <cmath>
- #include <algorithm>
- #define LL __int64
- const int maxn = +;
- const int INF = <<;
- using namespace std;
- int equ, var, fn;
- int a[maxn][maxn], x[maxn];
- bool free_x[maxn];
- int gcd(int a, int b)
- {
- return b==?a:gcd(b, a%b);
- }
- int lcm(int a, int b)
- {
- return a*b/gcd(a, b);
- }
- int Gauss(int x_mo)
- {
- //int x_mo;
- //x_mo = 7;
- int i, j, k, max_r, col;
- int ta, tb, LCM, tmp, fx_num;
- int free_index;
- col = ;
- for(k = ; k<equ && col<var; k++, col++)
- {
- max_r = k;
- for(i = k+; i < equ; i++)
- if(abs(a[i][col])>abs(a[max_r][col]))
- max_r = i;
- if(max_r != k)
- for(j = k; j < var+; j++)
- swap(a[k][j], a[max_r][j]);
- if(a[k][col]==)
- {
- k--;
- continue;
- }
- for(i = k+; i < equ; i++)
- {
- if(a[i][col] != )
- {
- LCM = lcm(abs(a[i][col]), abs(a[k][col]));
- ta = LCM/abs(a[i][col]);
- tb= LCM/abs(a[k][col]);
- if(a[i][col]*a[k][col] < ) tb = -tb;
- for(j = col; j < var+; j++)
- a[i][j] = ((a[i][j]*ta - a[k][j]*tb)%x_mo+x_mo)%x_mo;
- }
- }
- }
- for(i = var-; i >= ; i--)
- {
- tmp = a[i][var];
- for(j = i+; j < var; j++)
- if(a[i][j] != )
- tmp = ((tmp-a[i][j]*x[j])%x_mo+x_mo)%x_mo;
- if(a[i][i]==)
- x[i] = ;
- else
- {
- //if(tmp%a[i][i] != 0) return -2;
- while(tmp%a[i][i]!=) tmp += x_mo;
- x[i] = (tmp/a[i][i])%x_mo;
- }
- }
- return ;
- }
- int check(char ch)
- {
- if(ch=='*') return ;
- return ch-'a'+;
- }
- int Pow(int tmp, int j, int x_mo)
- {
- int sum = ;
- tmp %= x_mo;
- for(int i = ; i <= j; i++)
- {
- sum *= tmp;
- sum %= x_mo;
- }
- return sum%x_mo;
- }
- int main()
- {
- int x_mo, i, j, t, len, n;
- char s[maxn];
- scanf("%d", &t);
- while(t--)
- {
- scanf("%d %s", &x_mo, s);
- len = strlen(s);
- n = len;
- equ = n; var = n;
- memset(a, , sizeof(a));
- memset(x, , sizeof(x));
- for(i = ; i < n; i++)
- a[i][n] = (check(s[i]))%x_mo; //按照题目要求
- for(i = ; i < n; i++)
- {
- int tmp = check(s[i]);
- for(j = ; j < n; j++)
- {
- a[i][j] = Pow(i+, j, x_mo); //按照题目要求,由于直接求(i+1)^j会超int所以在计算的时候一直取模
- }
- }
- fn = Gauss(x_mo);
- for(i = ; i < n; i++)
- {
- if(i == n-) printf("%d\n", x[i]);
- else printf("%d ", x[i]);
- }
- }
- return ;
- }
POJ 2065 SETI (高斯消元 取模)的更多相关文章
- POJ.2065.SETI(高斯消元 模线性方程组)
题目链接 \(Description\) 求\(A_0,A_1,A_2,\cdots,A_{n-1}\),满足 \[A_0*1^0+A_1*1^1+\ldots+A_{n-1}*1^{n-1}\equ ...
- POJ 2065 SETI [高斯消元同余]
题意自己看,反正是裸题... 普通高斯消元全换成模意义下行了 模模模! #include <iostream> #include <cstdio> #include <c ...
- poj 2065 SETI 高斯消元
看题就知道要使用高斯消元求解! 代码如下: #include<iostream> #include<algorithm> #include<iomanip> #in ...
- POJ 2065 SETI 高斯消元解线性同余方程
题意: 给出mod的大小,以及一个不大于70长度的字符串.每个字符代表一个数字,且为矩阵的增广列.系数矩阵如下 1^0 * a0 + 1^1 * a1 + ... + 1^(n-1) * an-1 = ...
- 2017湘潭赛 A题 Determinant (高斯消元取模)
链接 http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id/1260 今年湘潭的A题 题意不难 大意是把n*(n+1)矩阵去掉某一列 ...
- B - SETI POJ - 2065 (高斯消元)
题目链接:https://vjudge.net/contest/276374#problem/B 题目大意: 输入一个素数p和一个字符串s(只包含小写字母和‘*’),字符串中每个字符对应一个数字,'* ...
- POJ SETI 高斯消元 + 费马小定理
http://poj.org/problem?id=2065 题目是要求 如果str[i] = '*'那就是等于0 求这n条方程在%p下的解. 我看了网上的题解说是高斯消元 + 扩展欧几里德. 然后我 ...
- POJ 2947-Widget Factory(高斯消元解同余方程式)
题目地址:id=2947">POJ 2947 题意:N种物品.M条记录,接写来M行,每行有K.Start,End,表述从星期Start到星期End,做了K件物品.接下来的K个数为物品的 ...
- POJ2065 SETI 高斯消元
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - POJ2065 题意概括 多组数据,首先输入一个T表示数据组数,然后,每次输入一个质数,表示模数,然后,给出一 ...
随机推荐
- 使用ASP.NET注册工具aspnet_regiis.exe注册IIS
该工具的名称为aspnet_regiis.exe,在32位机上,该工具存在于C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727,在64位机中“Framework ...
- JPA学习---第六节:大数据字段映射与字段延迟加载
1.大数据字段所需的注解 @Lob ,例如: @Lobprivate String info; 在mysql中映射产生的字段的类型是longtext:在oracle中是 CLOB @Lobpriva ...
- LintCode-Word Search II
Given a matrix of lower alphabets and a dictionary. Find all words in the dictionary that can be fou ...
- C++(MFC)编程一些注意事项
一·书写问题 1.括号:左右大括号最好都放在左侧,这样可以很清楚大括号的看清配对情况以及作用域,便于检查也不易出错. 2.强制转换:强制转换表达式时一定要加括号,否则可能只转换了表达式中的单个量,可能 ...
- Codeforces Round #328 (Div. 2) D. Super M
题目链接: http://codeforces.com/contest/592/problem/D 题意: 给你一颗树,树上有一些必须访问的节点,你可以任选一个起点,依次访问所有的必须访问的节点,使总 ...
- javascript中alert()与console.log()的区别
我们在做js调试的时候使用 alert 可以显示信息,调试程序,alert 弹出窗口会中断程序, 如果要在循环中显示信息,手点击关闭窗口都累死.而且 alert 显示对象永远显示为[object ]. ...
- BestCoder Round #2
TIANKENG’s restaurant http://acm.hdu.edu.cn/showproblem.php?pid=4883 竟然暴力1.44*10^7 还要*T=100 竟然过了 # ...
- 基于Pre-Train的CNN模型的图像分类实验
基于Pre-Train的CNN模型的图像分类实验 MatConvNet工具包提供了好几个在imageNet数据库上训练好的CNN模型,可以利用这个训练好的模型提取图像的特征.本文就利用其中的 “im ...
- CentOS下安装Redmine 2.5.2
Redmine是用Ruby开发的基于web的项目管理软件,所以先要下载安装Ruby,再下载对 Ruby组件进行打包的 Ruby 打包系统RubyGems. 第一步:下载必要的软件 1.依赖包安装 # ...
- 【面试题013】在O(1)时间删除链表结点
[面试题013]在O(1)时间删除链表结点 我们要删除结点i,我们可以把结点i的下一个结点j的内容复制到结点i,然后呢把结点i的指针指向结点j的下一个结点.然后在删除结点j. 1.如果结点i位于链表 ...