bzoj 4421: [Cerc2015] Digit Division

显然是找前缀为0的断点个数,注意如果全局答案不是0,那么ans=0
下面是简单的证明(kouhu)
首先,证明只有前缀为0的位置可以成为断点。
第一段显然前缀只能为0
假设前k段前缀只能为0,那么第k+1段一定满足 (f[k+1]-f[i]*10^(k-i))%m=0,由于f[i]%m=0,所以f[k+1]%m=0;
所以只有前缀为0的位置可以成为断点。
之后证明任意两个断点之间都是合法的(这是显然的)。
    
    
    
    
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
 
#define ll long long
#define inf 1e9
#define eps 1e-8
#define md 1000000007
using namespace std;
char st[1000010];
int main()
{
int n,m;
scanf("%d%d",&n,&m);
scanf("%s",st+1);
ll now=0; int ans=1;
for (int i=1;i<=n;i++)
{
now=(now*10+st[i]-'0')%m;
if (now==0&&i!=n) ans=ans*2%md;
}
if (now) printf("0\n"); else printf("%d\n",ans);
return 0;
}

你可能感兴趣的:(bzoj 4421: [Cerc2015] Digit Division)