HDU - 5685 Problem A(逆元)
这题我第一次想的就是直接模拟,因为我是这样感觉的,输入n是3次方,长度是5次方,加起来才8次方,里面的操作又不复杂,感觉应该能过,然而不如我所料,TLE了,玛德,这是第一次的代码。
- #include <bits/stdc++.h>
- using namespace std;
- const int INF=0x3f3f3f3f;
- typedef long long LL;
- #define PI(A) printf("%d\n",A)
- #define SI(N) scanf("%d",&(N))
- #define SII(N,M) scanf("%d%d",&(N),&(M))
- #define cle(a,val) memset(a,(val),sizeof(a))
- #define rep(i,b) for(int i=0;i<(b);i++)
- #define Rep(i,a,b) for(int i=(a);i<=(b);i++)
- #define reRep(i,a,b) for(int i=(a);i>=(b);i--)
- const double EPS= 1e- ;
- /* ///////////////////////// C o d i n g S p a c e ///////////////////////// */
- const int MAXN= + ;
- char str[MAXN];
- int N;
- int main()
- {
- while(~SI(N))
- {
- int x,y;
- scanf("%s",str);
- while(N--)
- {
- LL ans=;
- SII(x,y);
- x--,y--;
- for (int i=x;i<=y;i++)
- {
- ans=ans*((int)str[i]-);
- ans%=;
- }
- printf("%lld\n",ans);
- }
- }
- return ;
- }
之后想了一会,想不通,就查题解了,我看的是这个题解 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
- #include <bits/stdc++.h>
- using namespace std;
- const int INF=0x3f3f3f3f;
- typedef long long LL;
- #define PI(A) printf("%d\n",A)
- #define SI(N) scanf("%d",&(N))
- #define SII(N,M) scanf("%d%d",&(N),&(M))
- #define cle(a,val) memset(a,(val),sizeof(a))
- #define rep(i,b) for(int i=0;i<(b);i++)
- #define Rep(i,a,b) for(int i=(a);i<=(b);i++)
- #define reRep(i,a,b) for(int i=(a);i>=(b);i--)
- const double EPS= 1e- ;
- /* ///////////////////////// C o d i n g S p a c e ///////////////////////// */
- const int MAXN= + ;
- char str[MAXN];
- int h[MAXN];
- int N;
- int M=;
- //快速幂模板
- LL mod_pow(LL x,LL n,LL mod)
- {
- LL res=;
- while(n>){
- if (n&) res=res*x%mod;
- x=x*x%mod;
- n>>=;
- }
- return res;
- }
- int main()
- {
- while(~SI(N))
- {
- int x,y;
- scanf("%s",str);
- h[]=;
- //注意这是str[i]!='\0' 不是strlen(str) 如果换了 会超时,因为调用函数浪费时间,不信? 你自己试下,就知道了
- for (int i=;str[i];i++)
- {
- h[i+]=h[i]*(str[i]-)%M;
- }
- while(N--)
- {
- SII(x,y);
- printf("%lld\n",h[y]*mod_pow(h[x-],M-,M)%M);
- }
- }
- return ;
- }
做完这题,有个感悟,就是不管什么题,不求速度,只求质量,一定要搞懂,就算一周只看一个题,只要搞懂了,绝对比看100道,一道都没懂好。
在附赠一个测素数的代码:
- #include <bits/stdc++.h>
- using namespace std;
- int N;
- int main()
- {
- //PS:9973 1e9+7 都是素数
- while(cin>>N)
- {
- bool fl=;
- for (int i=;i<=sqrt(N);i++)
- {
- if (N%i==)
- fl=;
- }
- puts(fl&&N>?"yes":"no");
- }
- return ;
- }
HDU - 5685 Problem A(逆元)的更多相关文章
- hdu 5685 Problem A (逆元)
题目 题意:H(s)=∏i≤len(s)i=1(Si−28) (mod 9973),求一个字符串 子串(a 位到 b 位的)的哈希值.这个公式便是求字符串哈希值的公式,(字符的哈希值 = 字符的ASC ...
- HDU 5685 Problem A | 快速幂+逆元
Problem A Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total S ...
- hdu 5685 Problem A
Problem Description 度熊手上有一本字典存储了大量的单词,有一次,他把所有单词组成了一个很长很长的字符串.现在麻烦来了,他忘记了原来的字符串都是什么,神奇的是他竟然记得原来那些字符串 ...
- 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 - ...
- HDU 5685:2016"百度之星" - 资格赛 Problem A
原文链接:https://www.dreamwings.cn/hdu5685/2637.html Problem A Time Limit: 2000/1000 MS (Java/Others) ...
- 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 题意很好懂,就是组合数求和. 官方题解: 我来叨叨 ...
- hdu 5685(逆元)
Problem A Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total S ...
- hdu 2669 Romantic (乘法逆元)
Romantic Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- HDU 5976 数学,逆元
1.HDU 5976 Detachment 2.题意:给一个正整数x,把x拆分成多个正整数的和,这些数不能有重复,要使这些数的积尽可能的大,输出积. 3.总结:首先我们要把数拆得尽可能小,这样积才会更 ...
随机推荐
- spark 分析sql内容再插入到sql表中
package cn.spark.study.core.mycode_dataFrame; import java.sql.DriverManager;import java.util.ArrayLi ...
- hiho一下116周 网络流
网络流二·最大流最小割定理 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi:在上一周的Hiho一下中我们初步讲解了网络流的概念以及常规解法,小Ho你还记得内容么? ...
- 关闭V-Ray warning消息框
有时候模型使用低版本VR保存的,再次打开模型时会弹出V-Ray warning提示框 这个问题困扰了我一周时间.... 查了VR官方帮助文档 解决方法如下 setVRaySilentMode() -- ...
- ARM体系的7种工作模式
一.ARM体系的CPU有以下7种工作模式: 用户模式(usr) 大多数程序运行于用户模式 特权模式 系统模式(sys) 运行具有特权的操作系统任务 异常模式 中断模式(irq) ...
- Unity3D 几个基本动画(控制物体移动、旋转、缩放)
Transform基本移动函数: 1.指定方向移动: //移动速度 float TranslateSpeed = 10f; //Vector3.forward 表示"向前" tra ...
- ECLIPSE中添加TPTP插件
转自:http://blog.csdn.net/sinboy/article/details/1536625 程序在实际应用当中,大数据量时对系统本身的影响是一个不得不面对的问题. 最早在使用Jbui ...
- python--类方法、对象方法、静态方法
1.我们已经讨论了类/对象可以拥有像函数一样的方法,这些对象方法与函数的区别只是一个额外的self变量 # -*- coding:utf-8 -*- #!/usr/bin/python # Filen ...
- Jquery easyui的validatebox控件和正则表达式
http://blog.csdn.net/dandanzmc/article/details/36421465 仔细观察jquery.validatebox.js文件,会发现它的验证其实还是采用的正则 ...
- 07-Java 中的IO操作
1.Java IO简介: (1)I/O :in \out 即输入与输出.基本功能:读写. (2)IO流:作用:读写设备上的数据,硬盘文件.内存.键盘.网络-- 根据数据的走向,可分为:输入流.输出流. ...
- CSS3之Flexbox布局
CSS3为我们提供了一种可伸缩的灵活的web页面布局方式-flexbox布局,它具有很强大的功能,可以很轻松实现很多复杂布局,在它出现之前,我们经常使用的布局方式是浮动或者固定宽度+百分比来进行布局, ...