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 }

 

你可能感兴趣的:(bzoj 4292: [PA2015]Równanie)