bzoj 4421: [Cerc2015] Digit Division

4421: [Cerc2015] Digit Division

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
—————以下题解—————
首先,分出来的第一段必须%m=0(这是显然的)
f[i]为1~i的数值,判断(i,j)这一段是否可行(f[i]-f[j-1]*10k)%m==0,我们在第一段的基础上进行扩展,而且题目要求每一段都满足要求,所以f[j-1]%m=0,f[i]%m=0
由此可以得出结论,断点必为f[i]%m==0的点(不含最后)
最后答案就是2断点数,再特判一下就行了。
#include<stdio.h>
#include<iostream>
using namespace std;
const int M=1e9+7;
const int N=300005;
char s[N];
int x,i,n,m,ans;
int main()
{
    scanf("%d%d",&n,&m);
    scanf("%s",s+1);
    ans=1;
    for(i=1;i<=n;i++)
    {
        x=(x*10+s[i]-'0')%m;
        if(x==0&&i<n) ans=ans*2%M;
    }
    if(x) ans=0;
    cout<<ans;
    return 0;
}

 

posted @ 2016-06-07 13:12  lwq12138  阅读(258)  评论(0编辑  收藏  举报