【bzoj4292】[PA2015]Równanie 暴力

题目描述

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

输入

第一行包含三个正整数k,a,b(1<=k,a,b<=10^18,a<=b)。

输出

输出一个整数,即满足条件的n的个数。

样例输入

51 5000 10000

样例输出

3


题解

暴力

考虑一个$\le 10^{18}$的正整数,它的$f$值最大只有$f(999999999999999999)=9*9*18=1458$。

所以可以枚举$f(n)$,然后判断是否有满足条件的$n$即可。

#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll;
ll k , a , b;
ll calc(ll n)
{
ll ans = 0;
while(n) ans += (n % 10) * (n % 10) , n /= 10;
return ans;
}
ll solve(ll n)
{
ll i , ans = 0;
for(i = 1 ; i <= 1458 ; i ++ )
{
if(i * k > n) break;
if(calc(i * k) == i) ans ++ ;
}
return ans;
}
int main()
{
scanf("%lld%lld%lld" , &k , &a , &b);
printf("%lld\n" , solve(b) - solve(a - 1));
return 0;
}
上一篇:[BZOJ4292] [PA2015] Równanie


下一篇:My way to Python - Day05 - 面向对象