BZOJ 4292 PA2015 Równanie 枚举

f(n) n 在十进制下每一位数字的平方和,求 [a,b] 区间内有多少 n 满足 kf(n)=n

容易发现最大的 f(n) 不会超过 9918=1458 ,因此我们枚举 f(n) O(logn) Check即可

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
long long k,a,b;
int F(long long x)
{
    int re=0;
    while(x)
        re+=(x%10)*(x%10),x/=10;
    return re;
}
int main()
{
    int i,ans=0;
    cin>>k>>a>>b;
    for(i=min(b/k,1458ll);i;i--)
    {
        long long n=i*k;
        if(n>=a&&i==F(n))
            ++ans;
    }
    cout<<ans<<endl;
    return 0;
}

你可能感兴趣的:(bzoj,BZOJ4292)