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.总结:首先我们要把数拆得尽可能小,这样积才会更 ... 
随机推荐
- MySql重复查询
			MYSQL查询重复记录的方法很多,下面就为您介绍几种最常用的MYSQL查询重复记录的方法,希望对您学习MYSQL查询重复记录方面能有所帮助. 1.查找表中多余的重复记录,重复记录是根据单个字段(peo ... 
- tensor flow 视频
			http://v.youku.com/v_show/id_XMTYxMjQ2NTYyNA==.html?spm=a2h1n.8251843.playList.5!19~5~A.siMjNW&f ... 
- Java动态代理的实现方法
			AOP的拦截功能是由java中的动态代理来实现的.说白了,就是在目标类的基础上增加切面逻辑,生成增强的目标类(该切面逻辑或者在目标类函数执行之前,或者目标类函数执行之后,或者在目标类函数抛出异常时候执 ... 
- JPA调用函数
			criteriaBuilder.function("udf_get_cc_userright", Integer.class, criteriaBuilder.literal(se ... 
- jquery获取input file的文件名,具有兼容性
			var str=$(this).val();var arr=str.split('\\');//注split可以用字符或字符串分割var fileName=arr[arr.length-1];//这就 ... 
- (hash map)Two Sum, sorted(排序+双指针)closest,小于或大于的对数,组成不同的对数
			原版 sorted [抄题]: [思维问题]: 存sum - nums[i](补集),若出现第二次则调出 [一句话思路]: hashmap中,重要的数值当做key,角标当做value. [画图]: [ ... 
- 14-n皇后
			/*题目内容: 国际象棋中的皇后可以沿着水平线,垂直线,或者斜线前进,吃掉遇到的所有棋子,如果棋盘上有八个皇后,则这八个皇后如何相安无事的放置在棋盘上,1970年与1971年, E.W.Dijkstr ... 
- 文件Move操作
			#coding=utf-8 import os import shutil stra = "G:/should/v3/a" strb = "G:/should/v3/b& ... 
- 如何区分USB 2.0 和USB 3.0插口
			USB3.0的速度是USB2.0的十倍,并且比USB2.0更加节能,同时,还能向下兼容USB2.0.那么,我们怎么区分USB2.0 和 USB 3.0呢. 电脑(有USB2.0和USB3.0的插口) ... 
- 子类覆写的变量被private隐藏,强制转换方式通过子类访问父类的被覆写变量:
			import static java.lang.System.*; public class SuperParent{ public static void main(String[] args){ ... 
