时间限制: 1000MS
内存限制: 65536KB题目描述:
花花有一个很珍贵的数字串,但是它太长了,没有办法保留下来,所以她想截取其中一段保存下来,但是她希望截取下来的这一段数对1000000007取模之后等于Ai,她想知道有多少种截取方案。数字串S中截取一段是指S[L], S[L+1], …, S[R]连起来所形成的十进制数,其中L和R满足1≤L≤R≤|S|。例如S=“1023456789”,S(1,2)=10,S(2,4)=23,S(2,10)=23456789。
输入描述
第一行一个数字串,长度不超过30000。
第二行一个数T,表示询问的数量。(T≤100)
接下来T行,每行一个非负整数Ai,表示询问有多少种截取方案使得其值模1000000007后等于Ai。(0≤Ai<1000000007)
输出描述
共T行,每行一个非负整数,表示方案数。
示例:
样例输入
1000000008001 4 8 0 1 10样例输出
9 39 5 2
模数的使用方式:模数的一些分布特性如下:
1.(a + b)%c =((a%c)+(b%c))%c
2. (a * b)%c =((a%c)*(b%c))%c
3.(a – b)%c =((a%c)–(b%c))%c
- #include
- #include
- #include
-
- #define MAX_LEN 30000
- const unsigned int MOD = 1000000007;
-
- int getCountOfMod(char *str, int key)
- {
- unsigned int i =0, j = 0;
- int count = 0;
-
- //printf("str=%s,ai=%d:", str, key);
- for(i = 0; i < strlen(str); i++)
- {
- long remain = str[i] - '0'; //AC 64%
- // unsigned int remain = str[i] - '0'; //AC 55%
- if (remain == key)
- count++;
-
- for(j = i + 1; j < strlen(str); j++)
- {
- remain = ((remain * 10) % MOD + (str[j] - '0')) % MOD;
- if (remain == key)
- count++;
- }
- }
- return count;
- }
-
-
- int main()
- {
- int T = 0, Ai = 0;
- char *str = (char *)malloc((MAX_LEN + 2) * sizeof(char));
-
- scanf("%s", str);
- //printf("%s\n", str);
- scanf("%d", &T);
- //printf("%d\n", T);
- for (int i = 0; i < T; i++) {
- scanf("%d", &Ai);
- printf("%d\n", getCountOfMod(str, Ai));
- //printf("%d\n", Ai);
- }
-
- free(str);
- return 0;
- }
通过率仅有64%;欢迎各位大咖指导
----------------------------------------------------------------------------------------