BZOJ 4292 [PA2015] Równanie - 數位&思維

題目大意:

對於一個正整數 n,定義 f(n) 爲它十進制下每一位數字的平方的和。
現在給定三個正整數 k,a,b,請求出滿足 a≤n≤b 且 k×f(n) = n 的 n 的個數。
1 ≤k,a,b≤ 1018 ,a≤b。

分析:

這道題的數據規模看上去很嚇人,注意到最多有18位數,且每一位上的數字最大是9,所以f(x)max =18 * 9 *9=1458,所以直接枚舉每一位數字的平方和sum(1<=sum<=1458),算的n=k*sum
再檢驗一下n的每一位數字的平方和是否等於sum就ok了。

#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long LL;
const LL mxs=1458;
LL k,a,b,ans;
int main()
{
    scanf("%lld%lld%lld",&k,&a,&b);
    LL side=min(mxs,b/k);
    for(LL i=1;i<=side;i++){
        LL n=k*i;
        LL cnt=0;
        while(n){
            cnt+=(n%10)*(n%10);
            n/=1LL*10;
        }
        if(cnt==i&&a<=k*i&&k*i<=b)
            ans++;
    }
    printf("%lld",ans);
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章