题意:给出一个字符串,每次询问给出x和y要求算出从x到y的每个字符的(ASCII 码值-28)的值的积(mod9973)。

  分析:首先的想法肯定是算出每个位置的前缀积,然后只要F[y]/F[x-1]即可。但是每个前缀积都已经mod9973了,就不能直接这样得出结果了,所以利用求逆元。因为a/b(mod p)p是质数的话,相当于a*inv(b) (mod p),所以只要保存每个位置的前缀积和前缀积的逆元就可以了。

  但是题目有个坑点,如果x和y超出了这次字符串的位置,可以使用上一次数据储存的值而不是0,因为题目给定了x和y是不会超过字符串的长度的,所以每次给出输入数据以后我都memset一遍,导致这个地方WA了好几次。

  同时,这里有个技巧就是,既然逆元是mod9973的,那么只要储存下0到9972的逆元做个预处理即可节省大量的时间。具体见代码:

 #include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
const int mod = ;
int inv(int a,int b) //b是mod-2
{
int ans=;
while(b)
{
if(b&) ans=(ans*a)%mod;
b>>=;
a=a*a%mod;
}
return ans;
}
char s[+];
int num[+];
int p[+];
int res[];
int main()
{
int T;
for(int i=;i<mod;i++) res[i]=inv(i,mod-);
while(scanf("%d",&T)==)
{
scanf("%s",s+);
int len =strlen(s+);
//memset(num,0,sizeof(num));
//memset(p,0,sizeof(p));
num[]=p[]=;
for(int i=;i<=len;i++)
{
num[i]=num[i-]*(s[i]-)%mod;
p[i]=res[num[i]];
}
while(T--)
{
int x,y;
scanf("%d%d",&x,&y);
printf("%d\n",num[y]*p[x-]%mod);
}
}
return ;
}

注意红色部分的代码即可。

2016百度之星资格赛 Problem A(前缀积与求逆元)的更多相关文章

  1. HDU 5688:2016"百度之星" - 资格赛 Problem D

    原文链接:https://www.dreamwings.cn/hdu5688/2650.html Problem D Time Limit: 2000/1000 MS (Java/Others)    ...

  2. HDU 5686:2016"百度之星" - 资格赛 Problem B

    原文链接:https://www.dreamwings.cn/hdu5686/2645.html Problem B Time Limit: 2000/1000 MS (Java/Others)    ...

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

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

  4. [HDU5687]2016"百度之星" - 资格赛 Problem C

    题目大意:有n个操作,每个操作是以下三个之一,要你实现这些操作. 1.insert : 往字典中插入一个单词2.delete: 在字典中删除所有前缀等于给定字符串的单词3.search: 查询是否在字 ...

  5. [HDU5685]2016"百度之星" - 资格赛 Problem A

    题目大意:给你一个字符串,和一些问题,每个问题问你[l,r]子串的哈希值是多少. 哈希值计算方法为:$H(s)=\prod _{i=1} ^{i\leq len(s)}(s_i-28)(mod\ 99 ...

  6. [HDU5686]2016"百度之星" - 资格赛 Problem B

    题目大意:给你n,规定一个串中相邻的两个1可以合并为一个2(别的不行),让你求长度为n的全1串最多能变成多少种不同的串. 解题思路:我们先来找一波规律,发现n=1,2,3,4,5时答案分别为1,2,3 ...

  7. [HDU5688]2016"百度之星" - 资格赛 Problem D

    题目大意:给你n个字符串,如果一个字符串可以通过重新排列变成另一个字符串,则认为这两个字符串相等.每输入一个字符串,输出这个字符串和与它相等的之前出现了几次. 解题思路:我们可以用map保存一个字符串 ...

  8. 2016百度之星资格赛 Problem B(大数+组合数)

    题意:度熊面前有一个全是由1构成的字符串,被称为全1序列.你可以合并任意相邻的两个1,从而形成一个新的序列.对于给定的一个全1序列,请计算根据以上方法,可以构成多少种不同的序列.最多200个1. 比如 ...

  9. 2016百度之星 资格赛ABCDE

    看题:http://bestcoder.hdu.edu.cn/contests/contest_show.php?cid=690 交题:http://acm.hdu.edu.cn/search.php ...

随机推荐

  1. 转------深入理解--Java按值传递和按引用传递

    引言 最近刷牛客网上的题目时碰到不少有关Java按值传递和按引用传递的问题,这种题目就是坑呀,在做错了n次之后,查找了多方资料进行总结既可以让自己在总结中得到提高,又可以让其他人少走弯路.何乐而不为? ...

  2. IQueryable vs. IEnumerable

    IQueryable<T> extends the IEnumerable<T> interface IEnumerable<T> is great for wor ...

  3. C#基础--Ref与Out区别

    两者都是按地址传递的,使用后都将改变原来参数的数值. class Program { static void Main(string[] args) { int num = 1; Method(ref ...

  4. Postman如何进行参数化

    前言 Postman作为一款接口测试工具,受到了非常多的开发工程师的拥护. 那么做为测试,了解Postman这款工具就成了必要的了. 这篇文章就是为了解决Postman怎么进行参数化的. 全局变量 全 ...

  5. 在nuxt中引入Font Awesome字体图标库

    介绍 在element-ui框架中提供了一些图标样式,但是种类比较少,所以在这里提供一套更完善的字体图标库Font Awesome(官方文档),下面就开始介绍如何在一个nuxt项目中使用这套字体库. ...

  6. Win10建立标准账户并设置标准账户权限

    Win10建立标准账户,并使用组策略对标准帐户的权限进行管理. 注意:本文内容均在管理员帐户下操作,可以只看图片按图示步骤操作即可. 一.建立一个标准账户用于公用登录 (1)按”win健+R”运行“c ...

  7. TLS1.3&TLS1.2形式化分析(二)

    1.下面是TLS1.2和TLS1.3握手协议过程 ,明显的可以看出存在不同 . 我们先说TLS1.2的握手过程明显是比TLS1.3的握手过多了一次.在TLS1.3中舍弃了之前RSA的协商过程,然后基于 ...

  8. nginx用指针的值的最后一位来判断过期事件

    nginx中,将地址的最后一位取出来,用Instace变量标识,用来判断是否连接已经被释放成为过期时间 为什么指针地址最后一位一定是0呢? 这里的内存地址,一定是内存分配器分配出来的地址,如new . ...

  9. 推荐一个.NET(C#)的HTTP辅助类组件--restsharp

    互联网上关于.NET(C#)的HTTP相关的辅助类还是比较多的,这里再为大家推荐一个.NET的HTTP辅助类,它叫RestSharp.RestSharp是一个轻量的,不依赖任何第三方的组件或者类库的H ...

  10. redis事务机制

    目录 一.事务的实现 1.multi——开启事务 2.命令入队列 3.exec——执行事务 4.DISCARD——放弃执行 5.错误处理 二.watch命令 redis官方文档:Redis trans ...