hdu 5685 Problem A (逆元)
题意:H(s)=∏i≤len(s)i=1(Si−28) (mod 9973),求一个字符串 子串(a 位到 b 位的)的哈希值。这个公式便是求字符串哈希值的公式,(字符的哈希值 = 字符的ASCII码 - 28),字符串的哈希值等于字符的哈希值的乘积( ∏ 这个就是累乘符号 )。
化简过后的题意就是求一段序列中的区间乘,由于询问次数比较多,直接求乘会超时。
就比如如下代码:
#include<stdio.h>
char s[100010];
int main()
{
int T,a,b;
while(~scanf("%d",&T))
{
int ans = 1;
scanf("%s",s+1);
while(T--){
ans =1;
scanf("%d%d",&a,&b);
for(int i=a;i<=b;i++)
ans = ans * (s[i] - 28 ) % 9973;
printf("%d\n",ans);
}
}
return 0;
}
所以用前缀乘的方法,例如:0到b 区间的哈希值,除以 0到a 区间的哈希值,得到的就是 a 到 b 的哈希值。
若用preMulit[i]表示前i个序列的前缀乘。要求[l,r]区间内的的数字全乘起来,那么用preMulit[r] / preMulit[l-1] 即可,考虑到取模的问题,用到逆元。
那么我就要问了,为什么考虑到取模的问题,就要用到逆元呢?而且什么是逆元呢?
(看链接)
接下来就是解题代码了
代码一:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const ll maxn=100005;
const ll mod=9973;
ll sum[maxn],inv[maxn],re[maxn];
char s[maxn];
int main()
{
inv[1]=1;
for(int i=2;i<maxn;++i)
{
inv[i]=inv[mod%i]*(mod-mod/i)%mod;
}
int n;
//freopen("shuju.txt","r",stdin);
while(~scanf("%d",&n))
{
scanf("%s",s+1);
sum[0]=re[0]=1;
for(int i=1;s[i]!=0;++i)
{
sum[i]=(sum[i-1]*(s[i]-28))%mod;
re[i]=inv[sum[i]];
}
for(int i=0;i<n;++i)
{
ll a,b;
scanf("%lld%lld",&a,&b);
ll tp=re[a-1];
printf("%I64d\n",(sum[b]*tp)%mod);
}
}
return 0;
}
代码二:(通过extgcd直接求)
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const ll maxn=100005;
const ll mod=9973;
ll sum[maxn];
char s[maxn];
void extgcd(ll a,ll b,ll &x,ll &y)
{
if(!b)
{
x=1;y=0;
return;
}
extgcd(b,a%b,y,x);
y-=(a/b)*x;
}
ll inv(ll a,ll n)
{
ll d,x,y;
extgcd(a,n,x,y);
return (x+n)%n;
}
int main()
{
int n;
//freopen("shuju.txt","r",stdin);
while(~scanf("%d",&n))
{
scanf("%s",s+1);
sum[0]=1;
for(int i=1;s[i]!=0;++i)
{
sum[i]=(sum[i-1]*(s[i]-28))%mod;
}
for(int i=0;i<n;++i)
{
ll a,b;
scanf("%lld%lld",&a,&b);
ll tp=inv(sum[a-1],mod);
printf("%I64d\n",(sum[b]*tp)%mod);
}
}
return 0;
}
hdu 5685 Problem A (逆元)的更多相关文章
- 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(逆元)
这题我第一次想的就是直接模拟,因为我是这样感觉的,输入n是3次方,长度是5次方,加起来才8次方,里面的操作又不复杂,感觉应该能过,然而不如我所料,TLE了,玛德,这是第一次的代码. #include ...
- 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.总结:首先我们要把数拆得尽可能小,这样积才会更 ...
随机推荐
- delphi 图片加水印源代码
unit UWaterMark; interface uses {$IFNDEF DELPHIXE2ANDUP} windows,SysUtils,classes,graphics,Gdiplus; ...
- SciTE: 中文字符支持问题
SciTE: 中文字符支持问题 SciTE(Scintilla Text Editor)是一个体积小巧的文本编辑器. 但是它默认的设置对中文字符处理不好,其实只要对它进行相应的配置,就可以了. 1 ...
- webdriver自动化脚本
1.需求如下: 启动火狐浏览器首先打开百度,等待3秒然后打开博客首页,等待2秒然后关闭浏览器 from selenium import webdriver from time import sleep ...
- 记一次spring-session登录后失效的问题
用户登录后,可以进入页面,但ajax请求或跳转其他页面时,会被当做匿名用户,即没有登录.查看session数据库,发现多出两条session,一条为正常数据,里面有对应的用户名:另一条为异常的数据,没 ...
- IIS中的MIME类型设置
https://www.cnblogs.com/David-Young/p/5323949.html
- Mongodb相对于关系型数据库的优缺点(转)
与关系型数据库相比,MongoDB的优点: ①弱一致性(最终一致),更能保证用户的访问速度: 举例来说,在传统的关系型数据库中,一个COUNT类型的操作会锁定数据集,这样可以保证得到“当前”情况下的精 ...
- c语言指针数组和结构体的指针
指向数组的指针,先初始化一个数组,使用传统方式遍历 void main() { ] = { ,,,, }; ; i < ; i++) { printf("%d,%x\n", ...
- springmvc中Controller方法的返回值
1.1 返回ModelAndView controller方法中定义ModelAndView对象并返回,对象中可添加model数据.指定view. 1.2 返回void 在controller方法形参 ...
- js-移动端android浏览器中input框被软键盘遮住的问题解决方案
我遇到的问题:在一个页面里有一个弹出层之前我给我的最外层加了固定定位 用了下面的方法也不好使:没有办法我将之改为绝对定位层级变高在加上一个顶部标签通过js计算顶部高度来实现满屏遮挡: <sect ...
- DB2 SQL1477N问题
ERROR [55019] [IBM][DB2/NT] SQL1477N For table "DB_YHJX.YHJX_FHDKFHZ" an object "521 ...