题意:从N个人里面选出一个或者多个组成队伍,并选出一个作为队长,求所有的分组的可能数。
思路:瞎做。用组合数学加推导推导。
Ans=sum(C(n,k)*k,1<=k<=n)
然后将K乘进去,并且把最前面的N提出来,就变成了
Ans=sum(n*C(n-1,k-1),1<=k<=n)
Ans=n*2^(n-1)
代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <map>
using namespace std;
typedef long long LL;
int n;
const int MOD=1000000007;
LL qp(LL a,LL n)
{
LL ans=1;
a%=MOD;
while(n)
{
if(n&1)
ans=ans*a%MOD;
n>>=1;
a=a*a%MOD;
}
return ans;
}
int main()
{
// cout << lucas(1,1);
cin >> n;
for(int i=0;i<n;i++)
{
int tp;
cin >> tp;
cout << "Case #"<<i+1<<": ";
cout << tp*qp(2,tp-1)%MOD<<endl;
}
return 0;
}