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
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; }
一念起,天涯咫尺; 一念灭,咫尺天涯。