2018.5.30 T2绀碧之棺(coffin.cpp/c/pas)

题目背景Background

qiancl 得到了一张藏宝图,上面写了一道谜题

题目描述Description

定义F(n)为n在十进制下各个数位的平方和,求区间[a,b]中有多少 n满足 k F ( n ) = n

输入描述(coffin.in) Input Description

一行三个正整数k,a,b

输出描述(coffin.out) Output Description

一行一个整数表示满足条件的n 的个数

样例输入Sample Input

51 5000 10000

样例输出Sample Output

3

数据范围及提示Data Size & Hint
测试数据 对应数据范围
其中12个测试点 1 <= k , a , b <= 105
其中6个测试点 233 <= k <= 250 , 1 <= a , b <= 108
剩下32个测试点 1 <= k , a , b <= 1018

样例中满足的3 个n 分别是7293,7854,7905


36%
你发现 n 一定是k的倍数,然后暴力枚举即可
100%
感觉好假,18*81,如果每位都是9也最多只有这么大,枚举时判一下 n / k <= 18 81

#include <cstdio>
using namespace std;
#define LL long long
LL a,b,k,ans,cnt;
int sqr[15];
bool check(LL x) {
    LL sum=0;
    for (LL i=x;i;i/=10) sum+=sqr[i%10];
    if (sum*k==x) return 1;
    else return 0;
}
int main() {
    freopen("coffin.in","r",stdin);
    freopen("coffin.out","w",stdout);
    scanf("%lld%lld%lld",&k,&a,&b);
    for (int i=0;i<=9;i++) sqr[i]=i*i;
    while (cnt<a) cnt+=k;
    while (cnt<=b && cnt/k<=1500) {
        ans+=check(cnt);
        cnt+=k;
    }
    printf("%lld",ans);
}

猜你喜欢

转载自blog.csdn.net/qq_41893580/article/details/80514423
今日推荐