这题我第一次想的就是直接模拟,因为我是这样感觉的,输入n是3次方,长度是5次方,加起来才8次方,里面的操作又不复杂,感觉应该能过,然而不如我所料,TLE了,玛德,这是第一次的代码。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int INF=0x3f3f3f3f;
  5. typedef long long LL;
  6. #define PI(A) printf("%d\n",A)
  7. #define SI(N) scanf("%d",&(N))
  8. #define SII(N,M) scanf("%d%d",&(N),&(M))
  9. #define cle(a,val) memset(a,(val),sizeof(a))
  10. #define rep(i,b) for(int i=0;i<(b);i++)
  11. #define Rep(i,a,b) for(int i=(a);i<=(b);i++)
  12. #define reRep(i,a,b) for(int i=(a);i>=(b);i--)
  13. const double EPS= 1e- ;
  14.  
  15. /* ///////////////////////// C o d i n g S p a c e ///////////////////////// */
  16.  
  17. const int MAXN= + ;
  18.  
  19. char str[MAXN];
  20. int N;
  21.  
  22. int main()
  23. {
  24. while(~SI(N))
  25. {
  26. int x,y;
  27. scanf("%s",str);
  28. while(N--)
  29. {
  30. LL ans=;
  31. SII(x,y);
  32. x--,y--;
  33. for (int i=x;i<=y;i++)
  34. {
  35. ans=ans*((int)str[i]-);
  36. ans%=;
  37. }
  38. printf("%lld\n",ans);
  39. }
  40. }
  41. return ;
  42. }

  之后想了一会,想不通,就查题解了,我看的是这个题解 http://www.cnblogs.com/inmoonlight/p/5512340.html

  看了之后,觉得有几点要注意:

  1.像这样求连乘的,一段区间的东西,一定要先打表,之后在输入查询,否则几乎绝对超时,比如求这题可以换成H(t)/H(s-1),由此可以想到,连加的时候也可以打表,那就是H(t)-H(s-1)

  2.看到大数相除,还取模,那就是逆元了,可以用 exgcd 或 费马小定理求,这里可以写个函数自己判断下m是不是素数,9973 显然是素数,所以就费马小定理。费马小定理,H(n)的逆元为H(n)MOD-2 % MOD,当MOD是素数时。

  之后,理所当然,AC

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int INF=0x3f3f3f3f;
  5. typedef long long LL;
  6. #define PI(A) printf("%d\n",A)
  7. #define SI(N) scanf("%d",&(N))
  8. #define SII(N,M) scanf("%d%d",&(N),&(M))
  9. #define cle(a,val) memset(a,(val),sizeof(a))
  10. #define rep(i,b) for(int i=0;i<(b);i++)
  11. #define Rep(i,a,b) for(int i=(a);i<=(b);i++)
  12. #define reRep(i,a,b) for(int i=(a);i>=(b);i--)
  13. const double EPS= 1e- ;
  14.  
  15. /* ///////////////////////// C o d i n g S p a c e ///////////////////////// */
  16.  
  17. const int MAXN= + ;
  18.  
  19. char str[MAXN];
  20. int h[MAXN];
  21. int N;
  22. int M=;
  23.  
  24. //快速幂模板
  25. LL mod_pow(LL x,LL n,LL mod)
  26. {
  27. LL res=;
  28. while(n>){
  29. if (n&) res=res*x%mod;
  30. x=x*x%mod;
  31. n>>=;
  32. }
  33. return res;
  34. }
  35.  
  36. int main()
  37. {
  38. while(~SI(N))
  39. {
  40. int x,y;
  41. scanf("%s",str);
  42. h[]=;
  43. //注意这是str[i]!='\0' 不是strlen(str) 如果换了 会超时,因为调用函数浪费时间,不信? 你自己试下,就知道了
  44. for (int i=;str[i];i++)
  45. {
  46. h[i+]=h[i]*(str[i]-)%M;
  47. }
  48. while(N--)
  49. {
  50. SII(x,y);
  51. printf("%lld\n",h[y]*mod_pow(h[x-],M-,M)%M);
  52. }
  53. }
  54. return ;
  55. }

  做完这题,有个感悟,就是不管什么题,不求速度,只求质量,一定要搞懂,就算一周只看一个题,只要搞懂了,绝对比看100道,一道都没懂好。

  在附赠一个测素数的代码:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int N;
  4. int main()
  5. {
  6. //PS:9973 1e9+7 都是素数
  7. while(cin>>N)
  8. {
  9. bool fl=;
  10. for (int i=;i<=sqrt(N);i++)
  11. {
  12. if (N%i==)
  13. fl=;
  14. }
  15. puts(fl&&N>?"yes":"no");
  16. }
  17.  
  18. return ;
  19. }

HDU - 5685 Problem A(逆元)的更多相关文章

  1. hdu 5685 Problem A (逆元)

    题目 题意:H(s)=∏i≤len(s)i=1(Si−28) (mod 9973),求一个字符串 子串(a 位到 b 位的)的哈希值.这个公式便是求字符串哈希值的公式,(字符的哈希值 = 字符的ASC ...

  2. HDU 5685 Problem A | 快速幂+逆元

    Problem A Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total S ...

  3. hdu 5685 Problem A

    Problem Description 度熊手上有一本字典存储了大量的单词,有一次,他把所有单词组成了一个很长很长的字符串.现在麻烦来了,他忘记了原来的字符串都是什么,神奇的是他竟然记得原来那些字符串 ...

  4. HDU 6343.Problem L. Graph Theory Homework-数学 (2018 Multi-University Training Contest 4 1012)

    6343.Problem L. Graph Theory Homework 官方题解: 一篇写的很好的博客: HDU 6343 - Problem L. Graph Theory Homework - ...

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

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

  6. HDU 6333.Problem B. Harvest of Apples-组合数C(n,0)到C(n,m)求和-组合数学(逆元)+莫队 ((2018 Multi-University Training Contest 4 1002))

    2018 Multi-University Training Contest 4 6333.Problem B. Harvest of Apples 题意很好懂,就是组合数求和. 官方题解: 我来叨叨 ...

  7. hdu 5685(逆元)

    Problem A Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total S ...

  8. hdu 2669 Romantic (乘法逆元)

    Romantic Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  9. HDU 5976 数学,逆元

    1.HDU 5976 Detachment 2.题意:给一个正整数x,把x拆分成多个正整数的和,这些数不能有重复,要使这些数的积尽可能的大,输出积. 3.总结:首先我们要把数拆得尽可能小,这样积才会更 ...

随机推荐

  1. spark 分析sql内容再插入到sql表中

    package cn.spark.study.core.mycode_dataFrame; import java.sql.DriverManager;import java.util.ArrayLi ...

  2. hiho一下116周 网络流

    网络流二·最大流最小割定理 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi:在上一周的Hiho一下中我们初步讲解了网络流的概念以及常规解法,小Ho你还记得内容么? ...

  3. 关闭V-Ray warning消息框

    有时候模型使用低版本VR保存的,再次打开模型时会弹出V-Ray warning提示框 这个问题困扰了我一周时间.... 查了VR官方帮助文档 解决方法如下 setVRaySilentMode() -- ...

  4. ARM体系的7种工作模式

    一.ARM体系的CPU有以下7种工作模式:   用户模式(usr)    大多数程序运行于用户模式 特权模式   系统模式(sys)   运行具有特权的操作系统任务 异常模式 中断模式(irq)   ...

  5. Unity3D 几个基本动画(控制物体移动、旋转、缩放)

    Transform基本移动函数: 1.指定方向移动: //移动速度 float TranslateSpeed = 10f; //Vector3.forward 表示"向前" tra ...

  6. ECLIPSE中添加TPTP插件

    转自:http://blog.csdn.net/sinboy/article/details/1536625 程序在实际应用当中,大数据量时对系统本身的影响是一个不得不面对的问题. 最早在使用Jbui ...

  7. python--类方法、对象方法、静态方法

    1.我们已经讨论了类/对象可以拥有像函数一样的方法,这些对象方法与函数的区别只是一个额外的self变量 # -*- coding:utf-8 -*- #!/usr/bin/python # Filen ...

  8. Jquery easyui的validatebox控件和正则表达式

    http://blog.csdn.net/dandanzmc/article/details/36421465 仔细观察jquery.validatebox.js文件,会发现它的验证其实还是采用的正则 ...

  9. 07-Java 中的IO操作

    1.Java IO简介: (1)I/O :in \out 即输入与输出.基本功能:读写. (2)IO流:作用:读写设备上的数据,硬盘文件.内存.键盘.网络-- 根据数据的走向,可分为:输入流.输出流. ...

  10. CSS3之Flexbox布局

    CSS3为我们提供了一种可伸缩的灵活的web页面布局方式-flexbox布局,它具有很强大的功能,可以很轻松实现很多复杂布局,在它出现之前,我们经常使用的布局方式是浮动或者固定宽度+百分比来进行布局, ...