BZOJ 4292 [PA2015] Równanie - 数位&思维

题目大意:

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

分析:

这道题的数据规模看上去很吓人,注意到最多有18位数,且每一位上的数字最大是9,所以f(x)max=18 * 9 *9=1458,所以直接枚举每一位数字的平方和sum(1<=sum<=1458),算的n=k*sum
再检验一下n的每一位数字的平方和是否等于sum就ok了。

#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long LL;
const LL mxs=1458;
LL k,a,b,ans;
int main()
{
    scanf("%lld%lld%lld",&k,&a,&b);
    LL side=min(mxs,b/k);
    for(LL i=1;i<=side;i++){
        LL n=k*i;
        LL cnt=0;
        while(n){
            cnt+=(n%10)*(n%10);
            n/=1LL*10;
        }
        if(cnt==i&&a<=k*i&&k*i<=b)
            ans++;
    }
    printf("%lld",ans);
    return 0;
}
posted @ 2016-02-20 09:11  KatarinaYuan  阅读(102)  评论(0编辑  收藏  举报