题意是:给你两个数 n k,,问n的所有整数划分中,k出现的次数。
题解: 1 2 3 4 5 6 7
当n=5时,28 12 5 2 1
n =6 64 28 12 5 2 1 ·············································
规律即为 An=2*An-1 + 2^(n-3) n>=3;
求通项:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int mod=1000000007;
__int64 fun(int n)
{
__int64 res=1,a=2;
while(n)
{
if(n&1) res=res*a%mod;
a=(a%mod)*(a%mod) %mod;
n>>=1;
}
return res;
}
int main()
{
int ncase;
scanf("%d",&ncase);
while(ncase--)
{
__int64 n,k;
scanf("%I64d%I64d",&n,&k);
n=n-k+1;
if(n<=0){puts("0");continue;}
if(n==1) {puts("1");continue;}
if(n==2) {puts("2");continue;}
__int64 ans=fun(n-3);
ans=ans*(n-2)%mod;
ans=( ans+fun(n-1) )%mod;
printf("%I64d\n",ans);
}
return 0;
}