这道题我总是Wa在几个点。
最后根据题解重构,还是同样的错误。大家能不能帮忙看一下。
#include<bits/stdc++.h>
#define int long long
#define ffor(i,a,b) for(int i=(a);i<=(b);i++)
#define roff(i,a,b) for(int i=(a);i>=(b);i--)
using namespace std;
const int MAXN=5e6+10,MOD=1e9+7;
int T,n,k,p2[MAXN],fuc[MAXN],inv[MAXN];
int qpow(int base,int p) {
int ans=1;
while(p) {
if(p&1) ans*=base,ans%=MOD;
base*=base,base%=MOD,p>>=1;
}
return ans;
}
int C(int up,int down) {
return fuc[down]*inv[down-up]%MOD*inv[up]%MOD;
}
void work(void) {
cin>>n>>k;
int ans=0,m=k/2;
if(k%2==0) {
ffor(i,1,min(n,m)) ans+=C(i,m)*C(i-1,n-1)%MOD*p2[i]%MOD,ans%=MOD;
cout<<ans<<'\n';
}
else {
ffor(i,1,min(n,m)) ans+=C(i,m)*C(i-1,n-1)%MOD*p2[i]%MOD,ans%=MOD;
ffor(i,1,min(n-1,m)) ans+=C(i,m)*C(i-1,n-2)%MOD*p2[i]%MOD,ans%=MOD;
cout<<ans<<'\n';
}
}
signed main() {
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
fuc[0]=1;
int MX=5000000;
ffor(i,1,MX) fuc[i]=fuc[i-1]*i%MOD;
inv[MX]=qpow(fuc[MX],MOD-2);
roff(i,MX-1,0) inv[i]=inv[i+1]*(i+1)%MOD;
p2[0]=1;
ffor(i,1,MX) p2[i]=p2[i-1]*2%MOD;
cin>>T;
while(T--) work();
return 0;
}