题意:对于每个数的分解,列出其元素的出现的个数。
思路:比赛的时候把1~5的每个元素的个数列出来后就可以简单看出其中的固定规律
1 2 3 4 5
1 1 2 5 12 28
2 1 2 5 12
3 1 2 5
4 1 2
5 1
所以数列符合a_1 = 1, 2, 5, 12, 28 。。。。。a_n = 2*f(n-1)+2^(n-3)
最后拜问题哥推导出的公式:
a_1 = 1;
a_n = 2^(n-1) + (n-2)*2^(n-3);(n>=2)
代码如下:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const long long mod=1e9+7;
long long power(int n)
{
if (n==0) return 1;
if (n==1) return 2;
long long z=power(n/2);
if (n%2==0)
return z*z%mod;
else return z*z*2%mod;
}
main()
{
int T;
scanf("%d",&T);
while (T--)
{
int x,y;
scanf("%d%d",&x,&y);
int n=x-y+1;
if (n<=0)
{
printf("0\n");
continue;
}
if (n==1)
{
printf("1\n");
continue;
}
long long ans=(power(n-1))%mod+(1LL*(n-2)*power(n-3))%mod;
ans%=mod;
cout<<ans<<endl;
}
return 0;