洛谷 P1362 兔子數

2022-04-05 01:56:05 字數 1707 閱讀 4716

設 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 #include 

#include

#include

typedef

long

long

ll;using

namespace

std;

int maxn,l,r,l,d[200

],i,ans;

ll geth(ll f)

returnh;}

ll powe(ll a,ll b)

returnr;}

void

get(ll &x)

void

wamn()

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

)

wamn();

}int

main()

wamn();

}

view code

終究因為洛谷資料太弱 我的**才能過

放到codevs上大資料會蹦。。

終究因為我

void

get(ll &x)

這段**每次遞迴都要讀一次 太浪費時間

然後借鑑了同學做法,效率更高。 思想是一樣的

#include #include 

using

namespace

std;

int an[25500

],maxn,l,r,l,cnt,i,ans;

void find(int x,int y,int

z)

if(y*y==b) an[++cnt]=x;

}if(z>r) return

;

for(int i=0;i<4;++i)

find(x*10+i,y+i,z*10);}

intmain()

view code

洛谷 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 現在,給出乙個...

數論 洛谷 P1362 兔子數

我看到的時候一點頭緒都沒有汗 number 這題告訴你s a a s a s a 且a a 10 18 所以s a a 18 9 13 13 即s a 13 搜尋 適當剪枝即可 證明乙個定理 rabbit number的各位數字一定 3 若某數字x的一位,a 4 那麼它在該位的貢獻是a 2的 而在x...

LuoGu題解 P1362 兔子數

依題意模擬暴力打表找規律,注意到 符合題意的數中只包含 0,1,2,3 大於 3 的數,平方後都會進製,進製導致 s x s x 觀察資料範圍,最大滿足題意的數字有 10 位,那麼我們列舉每一位上的數字,然後暴力判斷是否為兔子數就行了。code include include include inc...