【SSL1343】无限序列

题目描述

思路

可以发现第 \(x\) 项的长度和 \(1\) 的个数是斐波那契数列。

然后就设 \(dp(x)\) 表示 \(1\sim x-1\) 之间多少个 \(1\)

又因为 \(1\) 的个数也是斐波那契数列,那就层层递归就行了!

代码

\(dp(x)\)

#define ll long long

ll dp(ll x)
{
	if(x == 0) return 0;
	
	for(int i = 1; i <= 100; i++)
	{
		if(len[i] == x) return f[i];
		if(len[i] > x) return dp(x - len[i - 1]) + f[i - 1];  
	}
}

\(\texttt{main()}\)

int main()
{
	f[1] = f[2] = 1;
	len[1] = 1;len [2] = 2;
	for (int i = 3; i <= 101; i++) f[i] = f[i - 1] + f[i - 2],
								len[i] = len[i - 1] + len[i - 2];
	for (scanf("%d", &q); q--;)
	{
		scanf("%lld%lld", &l, &r);
		printf("%lld\n", dp(r) - dp(l - 1));
	}
    return 0;
}
posted @ 2019-09-15 08:50  Jayun  阅读(138)  评论(0编辑  收藏  举报