4292: [PA2015]Równanie
Time Limit: 1 Sec Memory Limit: 256 MBSubmit: 224 Solved: 122
[ Submit][ Status][ Discuss]
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。
解题思路:
k * f(n) = n, 考虑到k,n都很大,但是f(n)最大却只有18 * 9 * 9 = 1458,因此可以枚举f(n)然后判断是否满足条件。简单题。
**************************************************************
Problem: 4292
User: mogu
Language: C++
Result: Accepted
Time:44 ms
Memory:1272 kb
****************************************************************/
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <vector>
#include <algorithm>
#define ll long long
using namespace std;
ll k, a, b;
bool check(ll x)
{
ll rs = 0, cnt = x;
while(x) {rs += (x % 10) * (x % 10); x /= 10;}
if(rs == cnt / k) return true;
return false;
}
int main()
{
scanf("%lld%lld%lld", &k, &a, &b);
ll ans = 0;
for(int i=1;i<=1458;i++)
{
long long t = k * i;
if(t < a || t > b) continue;
if(check(t)) ans++;
}
printf("%lld\n", ans);
return 0;
}