您的位置:首页 > 其它

hdu 4669——Mutiples on a circle

2013-08-15 00:10 375 查看
 

 

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
=num[0];
len
=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;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: