由归纳法可得,对于某一段(i,j)是其中一段当且仅当(1,j)%M=0且(1,i)%M=0。那么可以用前缀和的思想,统计出有多少(1,i)%M=0,假设有t个,那么答案就是2^t。
注意上述分析只有在有解的条件下成立,如果(1,n)%M!=0,那么答案=0。
AC代码如下:
#include<iostream>
#include<cstdio>
#define p 1000000007
using namespace std;
int n,m;
int main(){
scanf("%d%d",&n,&m); int i,t=0,ans=0;
char ch=getchar(); while (ch<'0' || ch>'9') ch=getchar();
for (i=1; i<=n; i++){
t=(t*10+ch-'0')%m;
if (!t) ans=(ans)?(ans<<1)%p:1;
ch=getchar();
}
if (t) puts("0"); else printf("%d\n",ans);
return 0;
}
by lych
2016.3.8