定义一个数字a是Beautiful Number当且仅当 a能被a的各位数字之和整除。问给一个N 求 1 --- N有多少个Beautiful Number。
N <= 1e12
看了这道题才去学的模版。。。
放一个理解模版的博客链接http://www.cnblogs.com/xz816111/p/4809913.html
解: N最多13位,各位数字之和范围 1---12*9, 直接枚举数位之和, 然后求解。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int mod, a[20];
ll n, dp[20][120][120];
ll dfs(int pos, int sum, int remind, int limit)
{
if(pos == -1) return sum == mod && remind == 0;
if(!limit && dp[pos][sum][remind] != -1) return dp[pos][sum][remind];
ll ans = 0;
int to = limit ? a[pos] : 9;
for(int i = 0; i <= to; i++)
{
if(sum + i > mod) break;
ans += dfs(pos-1, sum+i, (10*remind+i) % mod, limit && i == a[pos]);
}
if(!limit) dp[pos][sum][remind] = ans;
return ans;
}
ll solve(ll x)
{
int cnt = 0;
while(x) {
a[cnt++] = x%10;
x /= 10;
}
ll ans = 0;
for(int i = 1; i <= 9*cnt; i++)
{
memset(dp, -1, sizeof dp);
mod = i;
ans += dfs(cnt-1, 0, 0, true);
}
return ans;
}
int main()
{
int t, time = 0;
cin >> t;
while(t--)
{
ll n;
cin >> n;
printf("Case %d: %lld\n", ++time, solve(n));
}
return 0;
}