• 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
    ", sum ? 0 : pow(2, t - 1));
    50 }

    @Author: YouSiki

  • 相关阅读:
    快速幂
    1112个人赛,最长回文串常见算法讨论
    11-05-sdust-个人赛赛后随想
    UVA 1149 Bin Packing
    UVa 1608,Non-boring sequences
    UVa 10954,Add All
    UVa 714,Copying Books
    Careercup
    Careercup
    Careercup
  • 原文地址:https://www.cnblogs.com/yousiki/p/6281355.html
Copyright © 2020-2023  润新知