NOIP2016模拟-1014T2 Rabbit Number

来源:互联网 发布:淘宝纸箱机器 编辑:程序博客网 时间:2024/06/05 00:48

10.14模拟T2-Rabbit Number

题目大意

    设S(N)为N各位数字之和,如S(484) = 4 + 8 + 4 = 16;定义Rabbit Number为满足S(x*x) = S(x)*S(x)的数,问在(L,R)区间中有多少个Rabbit Number;

解题思路

    首先我们可以先暴力打一个表,然后不难发现每一个Rabbit Number的每一位都小于等于3,并且每个Rabbit Number去掉末尾一些数后依旧是一个Rabbit Number.根据这个规律,只需要从0开始搜索,往高位进行进位,可以很容易打出代码:
#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#define LL long long using namespace std;int n,k,a,b;LL sum(LL x) {    int ans = 0;    while ( x != 0 )        ans += x % 10,x /= 10;    return ans ;}int get(int s) {    int ans = 0;    for (int i=0;i<4;i++ ) {        LL x = s*10 + i;        if ( x == 0 || sum(x*x) != sum(x)*sum(x) )             continue;//如果当前数不为Rabbit数,则不需再进位搜索;        if ( a <= x && x <= b )             ans ++;        if ( x <= b / 10 )             ans += get(x);//可以进位(进位后不大于R)则进位搜索    }    return ans ;}int main() {    freopen("rabbit.in","r",stdin);    freopen("rabbit.out","w",stdout);    scanf( "%d%d", &a, &b );    cout << get(0) << endl;    fclose (stdin);    fclose (stdout);    return 0 ;}

数学证明

    假设数字x为 x1x2x3,那么    s(x)^2 = x1^2 + x2^2 + x3^2 + 2x1x2 + 2x1x3 + 2x2x3。    当    x3^2<10, 2x2x3<10, 2x1x3+x2^2<10, 2x1x2<10, x1^2<10时,    s(x^2) = s(x)^2。    所以x满足s(x)^2 = s(x^2) 时,必然满足各个位置上的数字小于等于3。
2 1
原创粉丝点击