1863: 神の數
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 202 Solved: 34
SubmitStatusWeb Board
Description
有一天,有一個小朋友送給萌萌的韜韜一本書,書的名字叫做《數》,韜韜對於數字有着無比的狂熱,一拿到這本書就沉迷於數的世界無法自拔,不久韜韜看到一個數字被稱爲神の數字——36,覺得很好奇,從未聽說過,又繼續往下看,發現原來36好厲害呢,有好多神奇的性質。
36 = (1 + 3 + 5 +7) + (2 + 4 + 6 + 8) 是前4個奇數與前4個偶數的和
36 = 1^3+2^3+3^3 還是前3個自然數的立方和
《三十六計》是一個神奇的東西,可以解決好多神奇的問題,是傑出的軍事家孫子大大寫就的一篇傳世巨擘。
人體能承受的安全電壓是36V,好巧耶。
… …
韜韜看到了這麼多36的神奇性質,想到了一個問題,給定區間範圍[l, r]內有多少跟36相關的數呢,韜韜在想什麼樣的數是和36相關的呢,換句話說,韜韜在思考如何給“36相關的數”一個定義。
一個“36相關的數”,首先它的十進制表示中必須得有36吧,嘛,相關度還得夠,一定不能有單個的3或者6,單個的3或6不是真的36呀。36036是一個“36相關的數”,而36633不是呢。好像漏掉了什麼東西,“這還不夠”,韜韜說道。
一個“36相關的數”,它必須能被36整除,這纔是真的和36相關嘛,韜韜發現在[1, 36]區間中只有36這個數滿足這些要求。韜韜想知道第二個這樣的數是多少呢,很遺憾,貌似100以內找不到這樣的數了呢。
韜韜非常沮喪,他熱切地想知道區間[l, r]中“36相關的數”有多少。好像又漏掉了點什麼呢,韜韜還想知道[l, r]區間中這些36相關數中有多少“36”存在,畢竟是36嘛。
既然韜韜現在很沮喪,一點算數的心情都沒有了,但是他很想知道上面提到的這些數呢,親愛的小夥伴你可以幫幫他嘛?
Input
第一行是測試樣例數 t (1 <= t <= 10^5) 接下來t行每行包括兩個正整數 l, r (1 <= l <= r <= 10^5).
Output
輸出包括t行,每行對應一次詢問,每行包括2個數 — 區間[l, r]中36相關數的數量, 36相關數中“36”的數量。
Sample Input
Sample Output
HINT
[1, 3636]中36相關數有36, 360, 936,1368, 1836, 2736, 3600, 3636這8個, “36”出現了9次
Source
解題思路:題意都不難理解,關鍵是注意題中的條件.題目是讓找出某個區間內和36相關的數的個數,即這些數包含36的個數.
首先明確怎樣是和相關,條件如下:
(1) 該數十進制表示要有36,(2)該數能被36整除,(3)該數不能包含單個3或6,否則其就不是與36相關的數.如6336(即使豈能被36整除且包含36,但其不滿足條件3,所以6336不是36的相關數.) (剛開始只考慮了前兩點.)
條件都考慮後打表過之.
AC-code:
#include<cstdio>
#include<cstring>
struct num
{
int number,n;
}ans[100010];
int fun(int n)
{
int i,j,u,v,k;
k=0;
while(n)
{
u=n%10;
v=(n/10)%10;
if((u==3)||(u==6&&v!=3)) return 0;
else
if(u==6&&v==3)
{
k++;
n/=100;
}
else
n/=10;
}
return k;
}
int solve()
{
int i,j,h=0;
j=0;
for(i=36;i<=100000;i+=36)
{
h=fun(i);
if(h>0)
{
ans[j].number=i;
ans[j++].n=h;
}
}
return j;
}
int main()
{
int t,l,r,i,j,k;
scanf("%d",&t);
k=solve();
while(t--)
{
int sum1=0,sum2=0;
scanf("%d%d",&l,&r);
for(i=0;i<k;i++)
{
if(ans[i].number>=l&&ans[i].number<=r)
{
sum1++;
sum2+=ans[i].n;
}
}
printf("%d %d\n",sum1,sum2);
}
return 0;
}