遇事不决先打表:
打表代码
#include <bits/stdc++.h>
using namespace std;
int num[1000];
deque<int> a,b;
void dfs(int n,int _n)
{
if(n==0)
{
while(_n--)
{int t=a.front();
num[t]++;
a.pop_front();
a.push_back(t);
}
return ;
}
for(int i=1;i<=n;i++)
{
a.push_back(i);
dfs(n-i,_n+1);
a.pop_back();
}
}
int main()
{
int n;
while(~scanf("%d",&n))
{
memset(num,0,sizeof(num));
a.clear();
dfs(n,0);
for(int i=1;i<=n;i++)
printf("%d %d\n",i,num[i]);
printf("\n");
}
return 0;
}
打表发现:
有规律,公式快速幂求解,存在不合法数据
#include <stdio.h>
#include <iostream>
#include <cmath>
using namespace std;
const long long MOD=1e9+7;
long long quick(long long a,long long b)
{
long long ans=1;
for(;b;b>>=1,a=a*a%MOD)
{
if(b&1)
ans=ans*a%MOD;
}
ans%=MOD;
return ans;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
long long n,k;
scanf("%lld %lld",&n,&k);
k=n-k;
if(k<0)
printf("0\n");
else
if(k<2)
{
if(k==1)printf("2\n");
else printf("1\n");
}
else
printf("%lld\n",((k+3)%MOD*quick(2,k-2)%MOD)%MOD);
}
}