bzoj 4292: [PA2015]Równanie
Description
对于一个正整数n,定义f(n)为它十进制下每一位数字的平方的和。现在给定三个正整数k,a,b,请求出满足a<=n<=b且k*f(n)=n的n的个数。
Input
第一行包含三个正整数k,a,b(1<=k,a,b<=10^18,a<=b)。
Output
输出一个整数,即满足条件的n的个数。
Sample Input
51 5000 10000
Sample Output
3
HINT
满足的3个n分别为7293,7854和7905。
解题:f(n)显然很小,然后枚举f(n)判断n是否满足条件即可,嗯当f(n)*k大于b的时候要及时退出,不然没搞明白溢出后到底哪里出错了T T
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 int main() 6 { 7 long long k,a,b,cnt=0; 8 scanf("%lld%lld%lld",&k,&a,&b); 9 for(int i=1;i<=1500;i++) 10 { 11 if(i*k > b)break; 12 long long n = k * i; 13 if(n < a || n > b)continue; 14 long long v = 0,temp = n; 15 while(n) 16 { 17 int u = n % 10; 18 v += u * u; 19 n /= 10; 20 } 21 if(v == i) 22 { 23 cnt++; 24 } 25 } 26 printf("%lld\n",cnt); 27 return 0; 28 }