【动态规划】【数位DP】[PA 2015]Rownanie

来源:互联网 发布:淘宝折扣 编辑:程序博客网 时间:2024/06/05 10:09

题目描述

对于一个正整数 n,定义 f(n) 为它十进制下每一位数字的平 方的和。 现在给定三个正整数 k,a,b,请求出满足 a≤n≤b 且 k×f(n) = n 的 n 的个数。
1≤k,a,b≤10^18
a≤b

样例输入

51 5000 10000

样例输出

3

题目分析

可以发现当每一位都取9的时候答案最大,那么我们可以发现最大的平方和为92×18=1458那么我们可以枚举f(n)的值然后得到一个n=f(n)k那么我们这个时候只需要验证f(f(n)k)=f(n)成立就行了

代码

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;typedef long long LL;const int MAXN = 9*9*18;LL k, a, b;LL solve(LL u){    LL n, sum, ret = 0;    for(LL i=1; i<=MAXN; i++){        n = i * k;        if(n > u) break;        sum = 0;        while(n){            sum += (n%10)*(n%10);            n /= 10;        }        if(sum == i)            ret ++;    }    return ret;}int main(){    scanf("%I64d%I64d%I64d", &k, &a, &b);    printf("%I64d\n", solve(b) - solve(a-1));    return 0;}
0 0
原创粉丝点击