题目链接

题意:

输入一个素数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个未知数的线性方程组,让求解。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <cstdlib>
  5. #include <cmath>
  6. #include <algorithm>
  7. #define LL __int64
  8. const int maxn = +;
  9. const int INF = <<;
  10. using namespace std;
  11. int equ, var, fn;
  12. int a[maxn][maxn], x[maxn];
  13. bool free_x[maxn];
  14.  
  15. int gcd(int a, int b)
  16. {
  17. return b==?a:gcd(b, a%b);
  18. }
  19. int lcm(int a, int b)
  20. {
  21. return a*b/gcd(a, b);
  22. }
  23. int Gauss(int x_mo)
  24. {
  25. //int x_mo;
  26. //x_mo = 7;
  27. int i, j, k, max_r, col;
  28. int ta, tb, LCM, tmp, fx_num;
  29. int free_index;
  30. col = ;
  31.  
  32. for(k = ; k<equ && col<var; k++, col++)
  33. {
  34. max_r = k;
  35. for(i = k+; i < equ; i++)
  36. if(abs(a[i][col])>abs(a[max_r][col]))
  37. max_r = i;
  38.  
  39. if(max_r != k)
  40. for(j = k; j < var+; j++)
  41. swap(a[k][j], a[max_r][j]);
  42.  
  43. if(a[k][col]==)
  44. {
  45. k--;
  46. continue;
  47. }
  48. for(i = k+; i < equ; i++)
  49. {
  50. if(a[i][col] != )
  51. {
  52. LCM = lcm(abs(a[i][col]), abs(a[k][col]));
  53. ta = LCM/abs(a[i][col]);
  54. tb= LCM/abs(a[k][col]);
  55. if(a[i][col]*a[k][col] < ) tb = -tb;
  56.  
  57. for(j = col; j < var+; j++)
  58. a[i][j] = ((a[i][j]*ta - a[k][j]*tb)%x_mo+x_mo)%x_mo;
  59. }
  60. }
  61. }
  62. for(i = var-; i >= ; i--)
  63. {
  64. tmp = a[i][var];
  65. for(j = i+; j < var; j++)
  66. if(a[i][j] != )
  67. tmp = ((tmp-a[i][j]*x[j])%x_mo+x_mo)%x_mo;
  68.  
  69. if(a[i][i]==)
  70. x[i] = ;
  71. else
  72. {
  73. //if(tmp%a[i][i] != 0) return -2;
  74. while(tmp%a[i][i]!=) tmp += x_mo;
  75. x[i] = (tmp/a[i][i])%x_mo;
  76. }
  77. }
  78. return ;
  79. }
  80. int check(char ch)
  81. {
  82. if(ch=='*') return ;
  83. return ch-'a'+;
  84. }
  85. int Pow(int tmp, int j, int x_mo)
  86. {
  87. int sum = ;
  88. tmp %= x_mo;
  89. for(int i = ; i <= j; i++)
  90. {
  91. sum *= tmp;
  92. sum %= x_mo;
  93. }
  94. return sum%x_mo;
  95. }
  96. int main()
  97. {
  98. int x_mo, i, j, t, len, n;
  99. char s[maxn];
  100. scanf("%d", &t);
  101. while(t--)
  102. {
  103. scanf("%d %s", &x_mo, s);
  104. len = strlen(s);
  105. n = len;
  106. equ = n; var = n;
  107. memset(a, , sizeof(a));
  108. memset(x, , sizeof(x));
  109. for(i = ; i < n; i++)
  110. a[i][n] = (check(s[i]))%x_mo; //按照题目要求
  111. for(i = ; i < n; i++)
  112. {
  113. int tmp = check(s[i]);
  114. for(j = ; j < n; j++)
  115. {
  116. a[i][j] = Pow(i+, j, x_mo); //按照题目要求,由于直接求(i+1)^j会超int所以在计算的时候一直取模
  117. }
  118. }
  119. fn = Gauss(x_mo);
  120. for(i = ; i < n; i++)
  121. {
  122. if(i == n-) printf("%d\n", x[i]);
  123. else printf("%d ", x[i]);
  124. }
  125. }
  126. return ;
  127. }

POJ 2065 SETI (高斯消元 取模)的更多相关文章

  1. 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 ...

  2. POJ 2065 SETI [高斯消元同余]

    题意自己看,反正是裸题... 普通高斯消元全换成模意义下行了 模模模! #include <iostream> #include <cstdio> #include <c ...

  3. poj 2065 SETI 高斯消元

    看题就知道要使用高斯消元求解! 代码如下: #include<iostream> #include<algorithm> #include<iomanip> #in ...

  4. POJ 2065 SETI 高斯消元解线性同余方程

    题意: 给出mod的大小,以及一个不大于70长度的字符串.每个字符代表一个数字,且为矩阵的增广列.系数矩阵如下 1^0 * a0 + 1^1 * a1 + ... + 1^(n-1) * an-1 = ...

  5. 2017湘潭赛 A题 Determinant (高斯消元取模)

    链接 http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id/1260 今年湘潭的A题 题意不难 大意是把n*(n+1)矩阵去掉某一列 ...

  6. B - SETI POJ - 2065 (高斯消元)

    题目链接:https://vjudge.net/contest/276374#problem/B 题目大意: 输入一个素数p和一个字符串s(只包含小写字母和‘*’),字符串中每个字符对应一个数字,'* ...

  7. POJ SETI 高斯消元 + 费马小定理

    http://poj.org/problem?id=2065 题目是要求 如果str[i] = '*'那就是等于0 求这n条方程在%p下的解. 我看了网上的题解说是高斯消元 + 扩展欧几里德. 然后我 ...

  8. POJ 2947-Widget Factory(高斯消元解同余方程式)

    题目地址:id=2947">POJ 2947 题意:N种物品.M条记录,接写来M行,每行有K.Start,End,表述从星期Start到星期End,做了K件物品.接下来的K个数为物品的 ...

  9. POJ2065 SETI 高斯消元

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - POJ2065 题意概括 多组数据,首先输入一个T表示数据组数,然后,每次输入一个质数,表示模数,然后,给出一 ...

随机推荐

  1. 使用ASP.NET注册工具aspnet_regiis.exe注册IIS

    该工具的名称为aspnet_regiis.exe,在32位机上,该工具存在于C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727,在64位机中“Framework ...

  2. JPA学习---第六节:大数据字段映射与字段延迟加载

    1.大数据字段所需的注解 @Lob ,例如: @Lobprivate String info; 在mysql中映射产生的字段的类型是longtext:在oracle中是  CLOB @Lobpriva ...

  3. LintCode-Word Search II

    Given a matrix of lower alphabets and a dictionary. Find all words in the dictionary that can be fou ...

  4. C++(MFC)编程一些注意事项

    一·书写问题 1.括号:左右大括号最好都放在左侧,这样可以很清楚大括号的看清配对情况以及作用域,便于检查也不易出错. 2.强制转换:强制转换表达式时一定要加括号,否则可能只转换了表达式中的单个量,可能 ...

  5. Codeforces Round #328 (Div. 2) D. Super M

    题目链接: http://codeforces.com/contest/592/problem/D 题意: 给你一颗树,树上有一些必须访问的节点,你可以任选一个起点,依次访问所有的必须访问的节点,使总 ...

  6. javascript中alert()与console.log()的区别

    我们在做js调试的时候使用 alert 可以显示信息,调试程序,alert 弹出窗口会中断程序, 如果要在循环中显示信息,手点击关闭窗口都累死.而且 alert 显示对象永远显示为[object ]. ...

  7. BestCoder Round #2

    TIANKENG’s restaurant http://acm.hdu.edu.cn/showproblem.php?pid=4883 竟然暴力1.44*10^7  还要*T=100  竟然过了 # ...

  8. 基于Pre-Train的CNN模型的图像分类实验

    基于Pre-Train的CNN模型的图像分类实验  MatConvNet工具包提供了好几个在imageNet数据库上训练好的CNN模型,可以利用这个训练好的模型提取图像的特征.本文就利用其中的 “im ...

  9. CentOS下安装Redmine 2.5.2

    Redmine是用Ruby开发的基于web的项目管理软件,所以先要下载安装Ruby,再下载对 Ruby组件进行打包的 Ruby 打包系统RubyGems. 第一步:下载必要的软件 1.依赖包安装 # ...

  10. 【面试题013】在O(1)时间删除链表结点

    [面试题013]在O(1)时间删除链表结点  我们要删除结点i,我们可以把结点i的下一个结点j的内容复制到结点i,然后呢把结点i的指针指向结点j的下一个结点.然后在删除结点j. 1.如果结点i位于链表 ...