P5991 [PA2015]Równanie
Wind_Smiled · · 题解
题意
对于一个正整数
现在给定三个正整数
对于
思路
- 模拟函数
\operatorname{f}(n) 对一个数的操作过程。 - 重复枚举可能的值,累加答案。
方案一:纯暴力枚举
令
但是根据数据范围:
方案二:优化
由题意得:
为方便计算,得出公式:
由题意
因为两数相等,则每一位相等。
所以
由
但是,最后个数会多计算
代码如下:
#include<bits/stdc++.h>
using namespace std;
long long k,a,b,sum,ans;
long long f(long long x){
long long ans=0;
while(x!=0){
ans+=(x%10)*(x%10);
x/=10;
}
return ans;
}
int main(){
cin>>k>>a>>b;
for(int i=1;i<=1458&&i*k<=b;i++){
if(f(i*k)==i){
ans++;
}
}
for(int i=1;i<=1458&&i*k<=a-1;i++){
if(f(i*k)==i){
ans--;
}
}
cout<<ans;
return 0;
}