zzulioj--1863--神の数(打表)

1863: 神の数

Time Limit: 1 Sec   Memory Limit: 128 MB
Submit: 155   Solved: 32

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

21 361 3636

Sample Output

1 18 9

HINT

[1, 3636]中36相关数有36, 360, 936,1368, 1836, 2736, 3600, 3636这8个, “36”出现了9次


一个模拟题,用一个结构体记录1--x中间有多少个36相关数,多少个36。

36的相关数要满足  1.能被36整除  2.数字中3还有6一定是连在一起的,一个数如果是36相关数它里边的36个数才可以加进去

#include<cstdio>
#include<cstring>
#include<queue>
#include<cstdlib>
#include<algorithm>
using namespace std;
struct node
{
	int x,y;
}f[100000+10];
char str[20];
void F()
{
	for(int i=0;i<36;i++)
	f[i].x=f[i].y=0;
	f[36].x=f[36].y=1;
	for(int i=37;i<=100000;i++)
	{
		if(i%36==0)
		{
			int temp=0,sign=1;
			memset(str,0,sizeof(str));
			sprintf(str,"%d",i);
			for(int j=0;j<strlen(str);j++)
			{
				if(str[j]=='3')
				{
					if(str[j+1]!='6')
					{
						sign=0;
						break;
					}
					else
					{
						temp++;
					}
				}
				else if(str[j]=='6')
				{
					if(j==0)
					{
						sign=0;
						break;
					}
					else if(str[j-1]!='3')
					{
						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;
	scanf("%d",&t);
	F();
	while(t--)
	{
		int l,r;
		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;
}


你可能感兴趣的:(zzulioj--1863--神の数(打表))