UVALive 7327 Digit Division

来源:互联网 发布:海马助手mac版 编辑:程序博客网 时间:2024/05/22 15:53

Description


We are given a sequence of n decimal digits. The sequence needs to be partitioned into one or more
contiguous subsequences such that each subsequence, when interpreted as a decimal number, is divisible
by a given integer m.
Find the number of different such partitions modulo 109+7. When determining if two partitions are
different, we only consider the locations of subsequence boundaries rather than the digits themselves,
e.g. partitions 2|22 and 22|2 are considered different.

Input


The input file contains several test cases, each of them as described below.
The first line contains two integers n and m (1 ≤ n ≤ 300000, 1 ≤ m ≤ 1000000) — the length
of the sequence and the divisor respectively. The second line contains a string consisting of exactly n
digits.

Output


For each test case, output a single integer — the number of different partitions modulo 109 + 7 on a
line by itself.

Sample Input


4 2
1246
4 7
2015

Sample Output


4
0



题意;一个数字分成多段,求每段都能整除m的方案数。
前缀一直加,不断mod m.为0就可以在这个段划分。贡献为2.最后注意判断整个数组能否被m整除,因为如果不能的话最后一段必然无法划分。
#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>#include <stack>#include <vector>#include <queue>#include <set>#include <map>#include <string>#include <math.h>#include <stdlib.h>#include <time.h>using namespace std;#define showtime fprintf(stderr,"time = %.15f\n",clock() / (double)CLOCKS_PER_SEC)#define lld %I64d#define REP(i,k,n) for(int i=k;i<n;i++)#define REPP(i,k,n) for(int i=k;i<=n;i++)#define scan(d) scanf("%d",&d)#define scanl(d) scanf("%I64d",&d)#define scann(n,m) scanf("%d%d",&n,&m)#define scannl(n,m) scanf("%I64d%I64d",&n,&m)#define mst(a,k)  memset(a,k,sizeof(a))#define LL long long#define N 1005inline int read(){    int s=0;    char ch=getchar();    for(; ch<'0'||ch>'9'; ch=getchar());    for(; ch>='0'&&ch<='9'; ch=getchar())s=s*10+ch-'0';    return s;}int ans,res;char str[1000500];const int mod=1e9+7;int main(){    int n,m;    while(scanf("%d%d%s",&n,&m,&str)!=EOF)    {        ans=0;        res=0;        for (int i=0; i<n; i++)        {            res=(res*10+str[i]-'0')%m;            if (res==0)            {                if(!ans)                    ans=1;                else                    ans=(ans*2)%mod;//2^(x-1)   划分的种类;            }            //showtime;        }        if (res>0)            ans=0;        cout<<ans<<endl;    }    return 0;}

0 0
原创粉丝点击