ZZULI 1863: 神の数【模拟】

1863: 神の数

Time Limit: 1 Sec   Memory Limit: 128 MB
Submit: 285   Solved: 56

Submit Status Web 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

2
1 36
1 3636

Sample Output

1 1
8 9
思路:模拟打表从1到i中间有多少个36相关数,多少个36,注意不能有单独的3或6
AC-code:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct node
{
	int x,y;
}f[100000+10];
void getf()
{
	int i,j,temp,sign;
	char str[7];
	for(i=0;i<36;i++)
		f[i].x=f[i].y=0;
	f[36].x=f[36].y=1;
	for(i=37;i<=100000;i++)
	{
		if(i%36==0)
		{
			temp=0;sign=1;
			memset(str,0,sizeof(str));
			sprintf(str,"%d",i);
			for(j=0;j<strlen(str);j++)
			{
				if(str[j]=='3')
				{
					if(str[j+1]!='6')
					{
						sign=0;
						break;
					}
					else
					{
						temp++;
						j++;
					}
				}
				else if(str[j]=='6')
				{
					sign=0;
					break;
				}
			}
			if(sign&&temp)
			{
				f[i].x=f[i-1].x+1;
				f[i].y=f[i-1].y+temp;
			}
			else
			{
				f[i].x=f[i-1].x;
				f[i].y=f[i-1].y;
			}
		}
		else
		{
			f[i].x=f[i-1].x;
			f[i].y=f[i-1].y;
		}
	}
 } 
int main()
{
	int T,l,r;
	getf();
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d%d",&l,&r);
		printf("%d %d\n",f[r].x-f[l-1].x,f[r].y-f[l-1].y);//均为闭区间
	}
	return 0;
}


你可能感兴趣的:(ZZULI 1863: 神の数【模拟】)