兔子数

xiaoxiao2021-02-28  90

【题目描述】 设 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 的个数。 【样例输入】 58 484 【样例输出】 24 【数据范围】 1<=L<=R<=10^9 【分析】 令x为一个兔子数,由题意得sqr(x)<10^18。 所以S(x*x)<18*9<13*13,即S(x)<13。 然后打表发现x的每一位都不会大于3,证明方法我不懂,不过网上应该多的是。 于是就是暴搜咯(也不反对打表)~

#include<cstdio> int l,r,s; int fct(long long x){ int c=0; for(;x;x/=10) c+=x; return c; } void work(int x){ int s1=fct(x),s2=fct((long long)x*x); if ((x>=l)&&((s1*s1)==s2)) s++; for (int i=!x;i<=3;i++) if ((x<=((r-i)/10))&&((s1+i)<=12)) work(x*10+i); } int main() { scanf("%d%d",&l,&r); work(0); printf("%d",s); }

也有一些非常神奇的代码:

#include<cstdio> #include<cstring> int k[1001]={0,1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9,10,2,3,4,5,6,7,8,9,10,11,3,4,5,6,7,8,9,10,11,12,4,5,6,7,8,9,10,11,12,13,5,6,7,8,9,10,11,12,13,14,6,7,8,9,10,11,12,13,14,15,7,8,9,10,11,12,13,14,15,16,8,9,10,11,12,13,14,15,16,17,9,10,11,12,13,14,15,16,17,18,1,2,3,4,5,6,7,8,9,10,2,3,4,5,6,7,8,9,10,11,3,4,5,6,7,8,9,10,11,12,4,5,6,7,8,9,10,11,12,13,5,6,7,8,9,10,11,12,13,14,6,7,8,9,10,11,12,13,14,15,7,8,9,10,11,12,13,14,15,16,8,9,10,11,12,13,14,15,16,17,9,10,11,12,13,14,15,16,17,18,10,11,12,13,14,15,16,17,18,19,2,3,4,5,6,7,8,9,10,11,3,4,5,6,7,8,9,10,11,12,4,5,6,7,8,9,10,11,12,13,5,6,7,8,9,10,11,12,13,14,6,7,8,9,10,11,12,13,14,15,7,8,9,10,11,12,13,14,15,16,8,9,10,11,12,13,14,15,16,17,9,10,11,12,13,14,15,16,17,18,10,11,12,13,14,15,16,17,18,19,11,12,13,14,15,16,17,18,19,20,3,4,5,6,7,8,9,10,11,12,4,5,6,7,8,9,10,11,12,13,5,6,7,8,9,10,11,12,13,14,6,7,8,9,10,11,12,13,14,15,7,8,9,10,11,12,13,14,15,16,8,9,10,11,12,13,14,15,16,17,9,10,11,12,13,14,15,16,17,18,10,11,12,13,14,15,16,17,18,19,11,12,13,14,15,16,17,18,19,20,12,13,14,15,16,17,18,19,20,21,4,5,6,7,8,9,10,11,12,13,5,6,7,8,9,10,11,12,13,14,6,7,8,9,10,11,12,13,14,15,7,8,9,10,11,12,13,14,15,16,8,9,10,11,12,13,14,15,16,17,9,10,11,12,13,14,15,16,17,18,10,11,12,13,14,15,16,17,18,19,11,12,13,14,15,16,17,18,19,20,12,13,14,15,16,17,18,19,20,21,13,14,15,16,17,18,19,20,21,22,5,6,7,8,9,10,11,12,13,14,6,7,8,9,10,11,12,13,14,15,7,8,9,10,11,12,13,14,15,16,8,9,10,11,12,13,14,15,16,17,9,10,11,12,13,14,15,16,17,18,10,11,12,13,14,15,16,17,18,19,11,12,13,14,15,16,17,18,19,20,12,13,14,15,16,17,18,19,20,21,13,14,15,16,17,18,19,20,21,22,14,15,16,17,18,19,20,21,22,23,6,7,8,9,10,11,12,13,14,15,7,8,9,10,11,12,13,14,15,16,8,9,10,11,12,13,14,15,16,17,9,10,11,12,13,14,15,16,17,18,10,11,12,13,14,15,16,17,18,19,11,12,13,14,15,16,17,18,19,20,12,13,14,15,16,17,18,19,20,21,13,14,15,16,17,18,19,20,21,22,14,15,16,17,18,19,20,21,22,23,15,16,17,18,19,20,21,22,23,24,7,8,9,10,11,12,13,14,15,16,8,9,10,11,12,13,14,15,16,17,9,10,11,12,13,14,15,16,17,18,10,11,12,13,14,15,16,17,18,19,11,12,13,14,15,16,17,18,19,20,12,13,14,15,16,17,18,19,20,21,13,14,15,16,17,18,19,20,21,22,14,15,16,17,18,19,20,21,22,23,15,16,17,18,19,20,21,22,23,24,16,17,18,19,20,21,22,23,24,25,8,9,10,11,12,13,14,15,16,17,9,10,11,12,13,14,15,16,17,18,10,11,12,13,14,15,16,17,18,19,11,12,13,14,15,16,17,18,19,20,12,13,14,15,16,17,18,19,20,21,13,14,15,16,17,18,19,20,21,22,14,15,16,17,18,19,20,21,22,23,15,16,17,18,19,20,21,22,23,24,16,17,18,19,20,21,22,23,24,25,17,18,19,20,21,22,23,24,25,26,9,10,11,12,13,14,15,16,17,18,10,11,12,13,14,15,16,17,18,19,11,12,13,14,15,16,17,18,19,20,12,13,14,15,16,17,18,19,20,21,13,14,15,16,17,18,19,20,21,22,14,15,16,17,18,19,20,21,22,23,15,16,17,18,19,20,21,22,23,24,16,17,18,19,20,21,22,23,24,25,17,18,19,20,21,22,23,24,25,26,18,19,20,21,22,23,24,25,26,27,1}; int n,m; int kk(long long x) { if(x<1001) return k[x]; return k[x%1000]+kk(x/1000); } int find(int x) { int ans=0; for(int i=0;i<4;i++) { long long num=x*10+i; int t=kk(num); if(num==0 || t*t!=kk(num*num)) continue; if(num>=n && num<=m) ans++; if(num<=m/10) ans+=find(num); } return ans; } int main() { scanf("%d%d",&n,&m); printf("%d",find(0)); } //打表能0ms秒掉
#include<bits/stdc++.h> #define LL long long using namespace std; inline LL s(LL x) { int sum=0; while(x) { sum+=x; x/=10; } return sum; } int main(){ LL l,r,x,y,t; int ans=0; scanf("%lld%lld",&l,&r); x=l; do{ t=10; while (x<=r){ y=x*x; LL sx=s(x),sy=s(y); if (sx*sx==sy){ ans++,x++; break; } x+=t-x%t; t*=10; } }while(x<=r); printf("%d",ans); } //写成非递归之后立刻快了好几倍啊~
转载请注明原文地址: https://www.6miu.com/read-68028.html

最新回复(0)