tjut 4669

#include <cstdio>  
#include <cstring>  
#include <cmath>  
#define M 50005  
#define K 205  
int mod[M], sum[M], dp[M][K], p[200005];  
int n, k;  
void POW()  
{  
    p[0] = 1;  
    for(int i = 1; i <= 4*n; ++i) p[i] = (p[i-1]*10)%k;  
}  
int main ()  
{  
    //freopen("in.txt","r",stdin);  
    //freopen("ou.txt","w",stdout);  
    while(scanf("%d%d",&n, &k)!=EOF)  
    {  
        POW();  
        for(int i=0; i<=n; ++i)  
            for(int j=0; j<=k; ++j) dp[i][j]=0;  
        for(int i = 1; i <= n; ++i)  
        {  
            scanf("%d",&sum[i]);  
            mod[i] =1+ log10(sum[i]*1.0);  
        }  
        int cnt=mod[1],s=sum[1]%k;  
        ++dp[1][s];  
        for(int i = 2; i <= n; ++i)  
        {  
            s = (sum[n-i+2]*p[cnt]+s)%k;  
            ++dp[1][s];  
            cnt+=mod[n-i+2];  
        }  
        int ans = dp[1][0];  
        for(int i = 2; i <= n; ++i)  
        {  
            ++dp[i][sum[i]%k];  
            for(int j = 0; j < k; ++j)  
                if(dp[i-1][j])  
                {  
                    int t = (j*p[mod[i]]+sum[i])%k;  
                    dp[i][t] += dp[i-1][j];  
                }  
            s=(s*p[mod[i]]+sum[i])%k;  
            dp[i][s]-=1;  
            ans+=dp[i][0];  
            s=(s-(sum[i]*p[cnt])%k+k)%k;  
        }  
        printf("%d\n",ans);  
    }  
    return 0;  
}  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值