alice132

 

2026.1.24 作业 - # P1362 兔子数

题目描述

\(S(N)\) 表示 \(N\) 的各位数字之和,如 \(S(484) = 4+8+4 = 16\)\(S(22) = 2+2 = 4\)。如果一个正整数满足 \(S(x \cdot x) = S(x) \cdot S(x)\),我们称之为 Rabbit Number。比方说,\(22\) 就是一个 Rabbit Number,因为 \(S(484) = S(22) \cdot S(22)\)

现在,给出一个区间 \([L,R]\),求在该区间内的 Rabbit Number 的个数。

输入格式

输入仅一行,为空格隔开的两个数 \(L\)\(R\)

输出格式

输出仅一行一个整数,表示所求 Rabbit Number 的个数。

输入输出样例 #1

输入 #1

22 22

输出 #1

1

输入输出样例 #2

输入 #2

484 484

输出 #2

0

输入输出样例 #3

输入 #3

1 58

输出 #3

12

输入输出样例 #4

输入 #4

58 484

输出 #4

24

输入输出样例 #5

输入 #5

1000000000 1000000000

输出 #5

1

说明/提示

对于 \(100 \%\) 的数据,\(1 \le L \le R \le 10^9\)

题解

对于满足条件的整数 \(X\) , 性质:\({0 \le x_i \le 3}\)

#include <iostream>
#define LL long long
using namespace std;
int L,R,a[12],Ans;
bool check(LL k) {
    int s1=0,s2=0;
    LL kk=k*k;
    while (k>0) s1+=k%10,k/=10;
    while (kk>0) s2+=kk%10,kk/=10;
    if (s1*s1==s2) return 1;else return 0;
}
void dfs(LL x) {
    if (x>R) return;
    if (x>=L && x<=R && check(x)) Ans++;
    for (int i=0;i<=3;i++) dfs(x*10+i);
}
int main() {
    cin>>L>>R;
    for (int i=1;i<=3;i++) dfs(i);
    cout<<Ans;
    return 0;
}

posted on 2026-01-24 21:51  alice_ss  阅读(0)  评论(0)    收藏  举报

导航