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

来源:互联网 发布:linux 串口 select 编辑:程序博客网 时间:2024/04/28 01:02

题目大意:

对于一个正整数 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;}
0 0
原创粉丝点击