zzulioj1863(模擬&打表)

1863: 神の數

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 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

21 361 3636

Sample Output

1 18 9

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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章