本题要求:(Ar*A2...An)%p,亦即[(A1*A2*...An)/(A1*A2*...Ar-1)]%p,由于A1*A2...An乘积过大,无法求得相除所得的结果

我们需要用到乘法逆元(a*k≡1 (mod p)的k值就是a关于p的乘法逆元),而乘法逆元有如下定理®:(a*k) mod p结果与(a/b) mod p等价,其中k为b关于p的乘法逆元

而由费马小定理(已知p是质数且gcd(a, p) = 1,则 ap-1 ≡ 1 (mod p),  所以 a*ap-2 ≡ 1 (mod p))知,a^(p-2)就是a的逆元了求解,利用快速幂运算计算(补充:亦可用扩展欧几里得求解)

注意具体求a时,应不断对p取mod

  1. #include <stdio.h>
  2. #include <string.h>
  3. #define LEN 100001
  4. #define P 9973
  5.  
  6. /*注意:转化为s时,必须从1开始,因为如果a=1,那么在做快速幂时,会用到s[-1],造成下标越界*/
  7. void Transform(char *s1,int *s){
  8. int i;
  9. s[0]=1;
  10. for(i=1;i<=strlen(s1);i++) //the entire len
  11. s[i]=s[i-1]*(s1[i-1]-28)%P;
  12. }
  13.  
  14. void HashValue(int a,int b,int *s){
  15. //s[b]*s[a-1]^(p-2) mod p
  16. //quickmod
  17. int res,tmp,n;
  18. n = P-2;
  19. res = 1;
  20. tmp = s[a-1];//s必须从1开始取
  21. while(n){
  22. if(n&1)
  23. res=(res*tmp)%P;
  24. n >>=1;
  25. tmp=(tmp*tmp)%P;
  26. }
  27.  
  28. printf("%d\n",s[b]*res%P);
  29. }
  30.  
  31. int main(){
  32. int n,a,b,i,s[LEN];
  33. char s1[LEN];
  34. while(scanf("%d",&n)!=EOF){
  35. getchar();
  36. gets(s1);
  37. Transform(s1,s);
  38. for(i=0;i<n;i++){
  39. scanf("%d%d",&a,&b);
  40. HashValue(a,b,s);
  41. }
  42. }
  43. return 0;
  44. }

定理 ®的证明:

由:b*k≡1 (mod p)有b*k=p*x+1,k=(p*x+1)/b
将k代入(a*k) mod p,得:
[a*(p*x+1)/b]mod p
=[(a*p*x)/b+a/b]mod p(注意:只要a整除b,自然有(a*p*x)整除b)
={[(a*p*x)/b] mod p +(a/b)} mod p
={[p*(a*x)/b]mod p +(a/b)} mod p,而p*[(a*x)/b] mod p=0

=(a/b) mod p

参考资料:

  [1]http://blog.csdn.net/nickwong_/article/details/38797629

[2]http://www.cnblogs.com/tiankonguse/archive/2012/08/14/2638949.html

[3]http://blog.csdn.net/jklongint/article/details/51415402

Time:20:48:52 2017-03-01

2016"百度之星"-资格赛的更多相关文章

  1. 2016百度之星 资格赛ABCDE

    看题:http://bestcoder.hdu.edu.cn/contests/contest_show.php?cid=690 交题:http://acm.hdu.edu.cn/search.php ...

  2. HDU 5688:2016"百度之星" - 资格赛 Problem D

    原文链接:https://www.dreamwings.cn/hdu5688/2650.html Problem D Time Limit: 2000/1000 MS (Java/Others)    ...

  3. HDU 5686:2016"百度之星" - 资格赛 Problem B

    原文链接:https://www.dreamwings.cn/hdu5686/2645.html Problem B Time Limit: 2000/1000 MS (Java/Others)    ...

  4. HDU 5685:2016"百度之星" - 资格赛 Problem A

    原文链接:https://www.dreamwings.cn/hdu5685/2637.html Problem A Time Limit: 2000/1000 MS (Java/Others)    ...

  5. 2016"百度之星" - 资格赛(Astar Round1)

    逆元 1001 Problem A 求前缀哈希和逆元 #include <bits/stdc++.h> typedef long long ll; const int MOD = 9973 ...

  6. 2016"百度之星" - 资格赛(Astar Round1) 1004

    思路:题目很简单,直接用map记录每个字符串的个数就可以了.记得对每个字符串先sort(). AC代码: #include <cstdio> #include <stdlib.h&g ...

  7. 2016"百度之星" - 资格赛(Astar Round1) 1001

    思路:第一个做法就是:每读入起始位置i和结束位置j,就从这位置i到位置j计算,可是TLE了,后面我想想要是我输入一个最长的字符串,且以最大次数计算开始位置1到结束位置100000,那么这计算量是很大的 ...

  8. 2016"百度之星" - 资格赛(Astar Round1) Problem E

    简单模拟题,耐心写就能过. #include <stdio.h> #include <math.h> #include<cstring> #include<c ...

  9. 2016"百度之星" - 资格赛(Astar Round1) Problem C

    字典树. 插入的时候update一下节点出现的次数. delete的时候,先把前缀之后的全删了.然后看前缀最后一个节点出现了几次,然后前缀上每个节点的次数都减去这个次数. 前缀从上到下再检查一遍,如果 ...

随机推荐

  1. R语言-妹子被追后的选择分析

    前提假设 妹子们一生中可以遇到100个追求者,追求者的优秀程度符合正态分布: 每个妹子都具备判断并比较追求者优秀程度的能力: 接受或拒绝一个追求者后永远无法后悔. 那么,问题来了 当遇到追求者时,如何 ...

  2. ABAP 表格控制(Table Control)和步循环

    表格控制(Table Control)和步循环     1.两个标准Demo: SAPMTZ60,SAPMTZ61 2.简介 3.建立Table Control程序的基本流程 4.使用步循环 5.表格 ...

  3. How to Build Office Developer Tools Projects with TFS Team Build 2012

    Introduction Microsoft Visual Studio 2012 provides a new set of tools for developing apps for Office ...

  4. Android性能优化--Listview优化

    ListView的工作原理 首先来了解一下ListView的工作原理(可参见http://mobile.51cto.com/abased-410889.htm),如图: ListView 针对每个it ...

  5. IOS 杂笔-18 (let 与 var)

    var 是 variable的缩写形式,是变量的意思 ,是可改变的,并不是数据类型. let 是常量的意思,不可改变的.

  6. 利用eclipse抽取 代码片段为方法

    选取要被抽取成方法的代码片段,右键->Refactor--->Extract Method 填写方法名称     抽取后成了这个样子:

  7. 数据库测试DbUnit

    DBUnit 的设计理念就是在测试之前,备份数据库,然后给对象数据库植入我们需要的准备数据,最后,在测试完毕后,读入备份数据库,回溯到测试前的状态: 摘自:DbUnit入门实战 DBUnit官网:ht ...

  8. Linux 基础知识----shell

    1.file title: #!/bin/bash 2.input: echo $1 echo $2 3.if # ifif [ "$1" = "N" ]the ...

  9. Git+GitHub 使用小结

    1.Git安装完成后需要做的配置            $ git config --global user.name "Your Name"        $ git confi ...

  10. nginx 负载均衡示例

    一.nginx nginx是一个轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,以开源形式发布.nginx的性能稳定,功能丰富,配置简单,且占用系统资源低.可支持多个 ...