2016"百度之星"-资格赛


本题要求:(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
#include <stdio.h>
#include <string.h>
#define LEN 100001
#define P 9973 /*注意:转化为s时,必须从1开始,因为如果a=1,那么在做快速幂时,会用到s[-1],造成下标越界*/
void Transform(char *s1,int *s){
int i;
s[0]=1;
for(i=1;i<=strlen(s1);i++) //the entire len
s[i]=s[i-1]*(s1[i-1]-28)%P;
} void HashValue(int a,int b,int *s){
//s[b]*s[a-1]^(p-2) mod p
//quickmod
int res,tmp,n;
n = P-2;
res = 1;
tmp = s[a-1];//s必须从1开始取
while(n){
if(n&1)
res=(res*tmp)%P;
n >>=1;
tmp=(tmp*tmp)%P;
} printf("%d\n",s[b]*res%P);
} int main(){
int n,a,b,i,s[LEN];
char s1[LEN];
while(scanf("%d",&n)!=EOF){
getchar();
gets(s1);
Transform(s1,s);
for(i=0;i<n;i++){
scanf("%d%d",&a,&b);
HashValue(a,b,s);
}
}
return 0;
}
定理 ®的证明:
由: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"百度之星"-资格赛的更多相关文章
- 2016百度之星 资格赛ABCDE
看题:http://bestcoder.hdu.edu.cn/contests/contest_show.php?cid=690 交题:http://acm.hdu.edu.cn/search.php ...
- HDU 5688:2016"百度之星" - 资格赛 Problem D
原文链接:https://www.dreamwings.cn/hdu5688/2650.html Problem D Time Limit: 2000/1000 MS (Java/Others) ...
- HDU 5686:2016"百度之星" - 资格赛 Problem B
原文链接:https://www.dreamwings.cn/hdu5686/2645.html Problem B Time Limit: 2000/1000 MS (Java/Others) ...
- HDU 5685:2016"百度之星" - 资格赛 Problem A
原文链接:https://www.dreamwings.cn/hdu5685/2637.html Problem A Time Limit: 2000/1000 MS (Java/Others) ...
- 2016"百度之星" - 资格赛(Astar Round1)
逆元 1001 Problem A 求前缀哈希和逆元 #include <bits/stdc++.h> typedef long long ll; const int MOD = 9973 ...
- 2016"百度之星" - 资格赛(Astar Round1) 1004
思路:题目很简单,直接用map记录每个字符串的个数就可以了.记得对每个字符串先sort(). AC代码: #include <cstdio> #include <stdlib.h&g ...
- 2016"百度之星" - 资格赛(Astar Round1) 1001
思路:第一个做法就是:每读入起始位置i和结束位置j,就从这位置i到位置j计算,可是TLE了,后面我想想要是我输入一个最长的字符串,且以最大次数计算开始位置1到结束位置100000,那么这计算量是很大的 ...
- 2016"百度之星" - 资格赛(Astar Round1) Problem E
简单模拟题,耐心写就能过. #include <stdio.h> #include <math.h> #include<cstring> #include<c ...
- 2016"百度之星" - 资格赛(Astar Round1) Problem C
字典树. 插入的时候update一下节点出现的次数. delete的时候,先把前缀之后的全删了.然后看前缀最后一个节点出现了几次,然后前缀上每个节点的次数都减去这个次数. 前缀从上到下再检查一遍,如果 ...
随机推荐
- ASP.NET Web API 数据提供系统相关类型及其关系
- mysql并发insert deadlock分析以及解决,无delete/update/for update
关于并发insert操作发生deadlock这个情况,一直有很多争议,而且网上的帖子所有的例证和模拟其实不一定反映了真实的情况,例如:https://www.percona.com/blog/2012 ...
- [Android] 环境配置之基础开发环境(SDK/Android Studio)(转)
[Android] 环境配置之基础开发环境(SDK/Android Studio) 博客: blog.csdn.net/qiujuer 网站: www.qiujuer.net 开源库: Geniu ...
- (九)play之yabe项目【发表博文】
(九)play之yabe项目[发表博文] 博客分类: 框架@play framework 发表一篇博文 填充管理页面 从主页链接到管理页面时,只简单显示了登陆用户的名称 现在对显示的内容加以丰富 ...
- SilverLight MD5加密
效果体验:http://keleyi.com/tool/md5.htm 嵌入页面的代码: <div style="width:400px;height:230px"> ...
- javascript --- 再谈词法分析
javascript代码是如何执行的呢,分为六个步骤(就像把大象装进冰箱总共分几步?): 第一步:载入第一个js代码段(注:script标签对内的代码或是引用js代码,这也说明js并不是一行一行(单纯 ...
- ABAP常用函数集锦
函数名 描述 SD_VBAP_READ_WITH_VBELN 根据销售订单读取表vbap中的信息EDIT_LINES 把READ_TEXT返回的LINES中的行按照TDFORMAT=“*”重新组织VI ...
- NLog 自定义字段 写入 oracle
1.通过Nuget安装NLog 下载,简单入门 请参照 我刚才转的几篇文章,下面我直接贴代码 2.建表语句 create table TBL_LOG ( id ) not null, appname ...
- Linux平台Makefile文件的编写基础入门(课堂作业)
根据老师的要求,写一个超简单的makefile准备: 准备三个文件:file1.c, file2.c, file2.h file1.c: #include "file ...
- arc下内存泄漏的解决小技巧
一定要注意,我们运行app时,一定要关心内存的使用,尽量不要超过20M,即使有很多图片要显示也绝对不能超过30M.所以运行自己开发的app时多关心内存的使用是个很好的习惯. 对于性能,内存的优化,这个 ...