百度之星资格赛 2016 Problem 1001

题意:

  度熊手上有一本字典存储了大量的单词,有一次,他把所有单词组成了一个很长很长的字符串。现在麻烦来了,他忘记了原来的字符串都是什么,神奇的是他竟然记得原来那些字符串的哈希值。一个字符串的哈希值,由以下公式计算得到:

请帮助度熊计算大字符串中任意一段的哈希值是多少。多组测试数据,每组测试数据第一行是一个正整数N,代表询问的次数,第二行一个字符串,代表题目中的大字符串,接下来N行,每行包含两个正整数a和b,代表询问的起始位置以及终止位置。

思路:

  首先利用一个前缀数组A[i]表示从第一个字符到第i个字符的字符串的H(s)值,如果要求从a到b,那么很显然是A[b] / A[a-1].又因为A数组是对9973取模的,所以相当于已知A[b] % P, A[a - 1] % P,求A[b] / A[a - 1].

已知 a % mod, b % mod, 求(a / b) % mod,用Inv(p)代表p的逆
(a / b) % mod = (a *  Inv(b)) % mod = (a % mod * Inv(b) % mod) % mod;
然后求 1 到 mod - 1 对 mod 逆元记为Inv(b % mod)
所以 (a / b) % mod = (a % mod * Inv(b % mod)) % mod;

求 1 到 mod - 1 对 mod 逆元的代码:

1 const int mod = 9973;
2 LL Inverse[mod + 7];
3 Inverse[0] = 0, Inverse[1] = 1;
4 for(int i = 2; i < mod; i++)
5     Inverse[i] = ( - ( mod / i ) * Inverse[ mod % i ] ) % mod + mod;

这道题代码:

 1 const int maxN = 1000000 + 7;
 2 const int p = 9973;
 3 LL ni[p];
 4 char str[maxN];
 5 LL a[maxN];
 6
 7 int main(){
 8     //freopen("input.txt", "r", stdin);
 9     ni[1] = 1;
10     ni[0] = 0;
11     for(int i = 2; i < p; i++)
12         ni[i] = (-(p/i) * ni[p%i]) % p + p;
13     int n;
14     while(~scanf("%d", &n))
15     {
16         scanf("%s", str);
17         int len = strlen(str);
18         a[0] = 1;
19         for(int i = 1; i <= len; i++)
20             a[i] = a[i - 1] * (str[i - 1] - 28) % p;
21         while(n--){
22             int s, m;
23             scanf("%d%d", &s, &m);
24             printf("%I64d\n", a[m] * ni[a[s - 1]] % p);
25         }
26     }
27     return 0;
28 }
时间: 2024-10-11 22:56:31

百度之星资格赛 2016 Problem 1001的相关文章

百度之星资格赛 2016 Problem 1002

题意: 度熊面前有一个全是由1构成的字符串,被称为全1序列.你可以合并任意相邻的两个1,从而形成一个新的序列.对于给定的一个全1序列,请计算根据以上方法,可以构成多少种不同的序列. 思路: 自己手动写几个后就会发现是大斐波那契. 代码: 1 import java.util.Scanner; 2 import java.math.BigInteger; 3 4 public class Main{ 5 public static void main(String[] args){ 6 Scann

百度之星资格赛 2016 Problem 1004

题意: 熊所居住的 D 国,是一个完全尊重人权的国度.以至于这个国家的所有人命名自己的名字都非常奇怪.一个人的名字由若干个字符组成,同样的,这些字符的全排列的结果中的每 一个字符串,也都是这个人的名字.例如,如果一个人名字是 ACM,那么 AMC, CAM, MAC, MCA, 等也都是这个人的名字.在这个国家中,没有两个名字相同的人.度熊想统计这个国家的人口数量,请帮助度熊设计一个程序,用来统计每一个人在之前被统计过多少次. 思路: 利用STL的map以人名为键值,以出现的次数为值,建立映射就

2014百度之星资格赛——Labyrinth

2014百度之星资格赛--Labyrinth Problem Description 度度熊是一只喜欢探险的熊,一次偶然落进了一个m*n矩阵的迷宫,该迷宫只能从矩阵左上角第一个方格开始走,只有走到右上角的第一个格子才算走出迷宫,每一次只能走一格,且只能向上向下向右走以前没有走过的格子,每一个格子中都有一些金币(或正或负,有可能遇到强盗拦路抢劫,度度熊身上金币可以为负,需要给强盗写欠条),度度熊刚开始时身上金币数为0,问度度熊走出迷宫时候身上最多有多少金币? Input 输入的第一行是一个整数T(

2016&quot;百度之星&quot; - 资格赛(Astar Round1) Problem D 简单题

Problem D Accepts: 1527 Submissions: 4307 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem Description 度熊所居住的 D 国,是一个完全尊重人权的国度.以至于这个国家的所有人命名自己的名字都非常奇怪.一个人的名字由若干个字符组成,同样的,这些字符的全排列的结果中的每一个字符串,也都是这个人的名字.例如,如果一个人名字

hdu 5685 Problem A(2016&quot;百度之星&quot; - 资格赛(Astar Round1)——线段树)

题目链接:acm.hdu.edu.cn/showproblem.php?pid=5685 Problem A Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 564    Accepted Submission(s): 236 Problem Description 度熊手上有一本字典存储了大量的单词,有一次,他把所有单词组成了一个很长

2014百度之星资格赛 1001:Energy Conversion(水题,逻辑题)

Energy Conversion Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4278    Accepted Submission(s): 1024 Problem Description 魔法师百小度也有遇到难题的时候-- 现在,百小度正在一个古老的石门面前,石门上有一段古老的魔法文字,读懂这种魔法文字需要耗费大量的能量和大量的

找规律 2015百度之星资格赛 1001 大搬家

题目传送门 1 /* 2 找规律:题目真心读不懂,排列组合的题目 3 */ 4 #include <cstdio> 5 #include <iostream> 6 #include <algorithm> 7 #include <cstring> 8 using namespace std; 9 10 typedef long long ll; 11 12 const int MAXN = 1e6 + 10; 13 const int INF = 0x3f3

找规律 百度之星资格赛 1001 大搬家

题目传送门 1 /* 2 找规律:题目真心读不懂,排列组合的题目 3 */ 4 #include <cstdio> 5 #include <iostream> 6 #include <algorithm> 7 #include <cstring> 8 using namespace std; 9 10 typedef long long ll; 11 12 const int MAXN = 1e6 + 10; 13 const int INF = 0x3f3

2014年百度之星 资格赛题解

比赛地址 1001: Energy Conversion Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 7787 Accepted Submission(s): 1894 Problem Description 魔法师百小度也有遇到难题的时候-- 现在,百小度正在一个古老的石门面前,石门上有一段古老的魔法文字,读懂这种魔法文字需要耗费大量的