BZOJ 4421: [Cerc2015] Digit Division

4421: [Cerc2015] Digit Division

Time Limit: 1 Sec  Memory Limit: 512 MB
Submit: 348  Solved: 202
[Submit][Status][Discuss]

Description

给出一个数字串,现将其分成一个或多个子串,要求分出来的每个子串能Mod M等于0.
将方案数(mod 10^9+7)
 

 

Input

给出N,M,其中1<=N<=300 000,1<=M<=1000 000.
接下来一行,一个数字串,长度为N。

 

Output

如题 

 

Sample Input

4 2
1246

Sample Output

4

HINT

 

Source

 
[Submit][Status][Discuss]

 

只需要求出所有能使得前缀数字串在mod意义下等于0的位置,设为$t$,则从这些位置任意切开,得到的串均满足要求。每个位置有两种选项(切或不切)答案是$2^{t}$。

 

 1 #include <cstdio>
 2 
 3 const int mod = 1e9 + 7;
 4 
 5 int n, m, t;
 6 char s[300005];
 7 
 8 inline int pow(long long a, int b)
 9 {
10     long long r = 1;
11     
12     while (b)
13     {
14         if (b & 1)
15         {
16             r *= a;
17             
18             if (r >= mod)
19                 r %= mod;
20         }
21         
22         b >>= 1;
23         a = a * a;
24     
25         if (a >= mod)
26             a %= mod;
27     }
28     
29     return r;
30 }
31 
32 signed main(void)
33 {
34     scanf("%d%d%s", &n, &m, s);
35     
36     int sum = 0;
37     
38     for (char *c = s; *c; ++c)
39     {
40         sum = sum * 10 + *c - '0';
41         
42         if (sum >= m)
43             sum %= m;
44         
45         if (sum == 0)
46             ++t;
47     }
48     
49     printf("%d\n", sum ? 0 : pow(2, t - 1));
50 }

 

@Author: YouSiki

 

posted @ 2017-01-13 07:46  YouSiki  阅读(163)  评论(0编辑  收藏  举报