首页 > 代码库 > 洛谷 P1362 兔子数

洛谷 P1362 兔子数

题目描述

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

现在,给出一个区间 [L, R],求在该区间内的 Rabbit N umber 的个数。

输入输出格式

输入格式:

 

输入仅一行,为空格隔开的两个数 L 和 R。

 

输出格式:

 

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

 

输入输出样例

输入样例#1:
样例1:22 22样例2:484 484样例3:1 58样例4:58 484样例5:1000000000 1000000000
输出样例#1:
样例1:1样例2:0样例3:12样例4:24样例5:1

说明

1 <= L <= R <= 10^9

 屠龙宝刀点击就送

经过2.9G打表发现 

rabbit number的各位数字一定<=3

#include <cstdlib>#include <cstdio>#include <stack>#include <cmath>typedef long long LL;using namespace std;int maxn,L,R,l,d[200],i,ans;LL geth(LL f){    LL h=0;    while(f)    {        h+=f%10;        f/=10;    }    return h;}LL powe(LL a,LL b){    LL base=a,r=1;    while(b)    {        if(b&1)        r*=base;        base*=base;        b>>=1;    }    return r;}void get(LL &x){    x=0;    for(i=1;i<=l;++i)    x=x*10+d[l-i+1];}void wamn(){    LL n;    get(n);    if(n>R)    {        printf("%d",ans);        exit(0);    }    LL m=powe(n,2);    LL x=geth(n),y=geth(m);    if(x*x==y) ans++;    d[1]++;    int k=1;    while(d[k]>3)    {        d[k+1]+=1;        d[k]=0;        l=max(l,k+1);        k++;    }    wamn();}int main(){    scanf("%d%d",&L,&R);    stack<int>q;    while(L)    {        d[++l]=L%10;        L/=10;    }    wamn();}

 

洛谷 P1362 兔子数