무한 서열

D e s c r i p t i o n Description Description


우리는 다음과 같은 방식으로 서열을 생성한다. 1. 시작할 때 서열은'1'이다.2. 매번 변화는 서열의 "1"을 "10", "0"을 "1"으로 만든다.무한한 변화를 거쳐 우리는 서열'10101010101010101101...'을 얻었다.총 Q 개의 질문이 있는데, 매번 질문은 구간 A와 B 사이에 몇 개의 1이 있는지 하는 것이다.퀘스트는 Q개의 질문에 대답하는 프로그램을 작성합니다

I n p u t Input Input


첫 번째 행위는 하나의 정수 Q이고 뒤에 Q줄이 있으며 줄마다 두 개의 수는 공백으로 구분된 정수 a, b이다.

O u t p u t Output Output


총 Q 행, 각 행마다 응답

S a m p l e Sample Sample I n p u t Input Input

1
2 8 

S a m p l e Sample Sample O u t p u t Output Output

4 

H i n t Hint Hint


1 <= Q <= 5000 1 <= a <= b < 2^63

T r a i n Train Train o f of of T h o u g h t Thought Thought


먼저 그 서열을 보면 피보나치 수열의 형식에 따라 점차적으로 증가하는 것을 발견할 수 있다. 그리고 우리는 접두사와 발견을 추가할 수 있다.

C o d e Code Code

#include
#include
using namespace std;
long long f[1005][2],Q; long long a,b;
long long work(long long x)
{
	if (x==0) return 0;
	for (int i=0; i<=100; ++i)
	{
		if (x==f[i][1]) return f[i][0];// 
		 else if (x<f[i][1]) return f[i-1][0]+work(x-f[i-1][1]);// 
	}
}
int main()
{
	scanf("%lld",&Q);
	f[0][0]=1; f[0][1]=1;//f[0][0] 1 
	f[1][0]=1; f[1][1]=2;//f[0][1] 
	for (int i=2; i<=100; ++i)
	  f[i][0]=f[i-1][0]+f[i-2][0],f[i][1]=f[i-1][1]+f[i-2][1];
	for (int i=1; i<=Q; ++i)
	{
		scanf("%lld%lld",&a,&b);
		printf("%lld
"
,work(b)-work(a-1)); } return 0; }

좋은 웹페이지 즐겨찾기