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


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