http://www.cnblogs.com/GBRgbr/archive/2013/08/14/3256584.html
参考之。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<map>
#include<set>
#include<string>
#include<cctype>
#include<vector>
#include<queue>
using namespace std;
#define maxn 55000
#define INF 10000000
#define LL __int64
int num[maxn];
int len[maxn];
int fac[maxn<<2];
int dp[maxn][300];
int n,k;
void init()
{
fac[0]=1;
for(int i=1;i<=n*3;i++)
fac[i]=(fac[i-1]*10)%k;
}
int GetLen(int x)
{
int len=0;
while(x)
{
len++;
x/=10;
}
return len;
}
int main()
{
while(cin>>n>>k)
{
init();
for(int i=0;i<=n;i++)
for(int j=0;j<=k;j++)
dp[i][j]=0;
for(int i=0;i<n;i++)
{
scanf("%d",&num[i]);
len[i]=GetLen(num[i]);
}
num[n]=num[0];
len[n]=len[0];
int sum=0;
int L=0;
for(int i=n;i>0;i--)
{
sum=(num[i]*fac[L]+sum)%k;
dp[0][sum]++;
L+=len[i];
}
LL ans=dp[0][0];
for(int i=1;i<n;i++)
{
for(int j=0;j<k;j++)
dp[i][(j*fac[len[i]]+num[i])%k]+=dp[i-1][j];
sum=(sum*fac[len[i]]+num[i])%k;
dp[i][num[i]%k]++;
dp[i][sum]--;
sum =((sum-num[i]*fac[L])%k+k)%k;
ans+=dp[i][0];
}
printf("%I64d\n",ans);
}
return 0;
}