1799: [Ahoi2009]self 同类分布
Time Limit: 50 Sec Memory Limit: 64 MBSubmit: 1358 Solved: 592
[ Submit][ Status][ Discuss]
Description
给出a,b,求出[a,b]中各位数字之和能整除原数的数的个数。
Input
Output
Sample Input
10 19
Sample Output
3
dp[len][x][y][p]表示当前到了len位,前面所有数之和为x,对p取模为y的情况个数
最后当len=0时,如果x==p && y==0就合法
不过你不遍历完每一位你是不会知道所有数之和的,所以p要暴力,位数之和<=9*18不会超时
既然是单实例,直接省掉第四维吧,高维寻址反而慢
#include<stdio.h>
#include<string.h>
#define LL long long
LL str[22], dp[22][166][166];
LL Sech(LL len, LL x, LL y, LL flag, LL mod)
{
LL i, c, ans;
if(len==0)
{
if(x==mod && y==0)
return 1;
return 0;
}
if(flag==0 && dp[len][x][y]!=-1)
return dp[len][x][y];
c = 9;
if(flag)
c = str[len];
ans = 0;
for(i=0;i<=c;i++)
ans += Sech(len-1, x+i, (y*10+i)%mod, flag && i==c, mod);
if(flag==0)
dp[len][x][y] = ans;
return ans;
}
LL Jud(LL x)
{
LL i, len, ans;
if(x==0)
return 0;
ans = len = 0;
while(x)
{
str[++len] = x%10;
x /= 10;
}
for(i=1;i<=len*9;i++)
{
memset(dp, -1, sizeof(dp));
ans += Sech(len, 0, 0, 1, i);
}
return ans;
}
int main(void)
{
LL L, R;
while(scanf("%lld%lld", &L, &R)!=EOF)
printf("%lld\n", Jud(R)-Jud(L-1));
return 0;
}