我不知道哪里错了,样例中较小的部分没过,较大的部分反而过了。由于一些原因我明天8:30之前必须 AC,急求助。
#include <bits/stdc++.h>
using namespace std;
namespace Main
{
typedef long long ll;
const ll mod=1e9+7;
int t;
const int maxn = 2005;
int n,m,k;
inline int read()
{
int x = 0, f = 1;
char ch = getchar();
while (!isdigit(ch))
{
if (ch == '-')
f = -1;
ch = getchar();
}
while (isdigit(ch))
{
x = (x << 1) + (x << 3) + (ch ^ 48);
ch = getchar();
}
return x * f;
}
inline ll ksm(ll a,ll b,ll p)
{
ll ret=1;
while(b)
{
if(b&1)ret=ret*a%p;
a=a*a%p;
b>>=1;
}
return ret;
}
inline ll ny(ll a,ll p)
{
return ksm(a,p-2,p);
}
void write(int x)
{
if(x<0)
{
x=-x;
putchar('-');
}
if(x>=10)write(x/10);
putchar(x%10^48);
}
ll fact[1000005];
inline ll C(ll n,ll m)
{
if(n<m)return 0;
return fact[n]*ny(fact[m],mod)%mod*ny(fact[n-m],mod)%mod;
}
inline void solve()
{
n=read();
m=read();
k=read();
ll ans=0;
for(ll i=1;i<=m;i++)
{
ans+=k*i*C(n-i-1,m-i)%mod*ny(1<<(n-i),mod)%mod;
ans%=mod;
}
printf("%lld\n",ans);
}
void main()
{
fact[0]=1;
for(int i=1;i<=1000000;i++)
{
fact[i]=fact[i-1]*(ll)i;
fact[i]%=mod;
}
t=read();
while(t--)
{
solve();
}
#ifndef ONLINE_JUDGE
system("pause");
#endif
}
}
int main()
{
Main::main();
return 0;
}