UVa 11609 - Teams

题目:n个人中取出k个人组成一个小组,并且其中有一名组长,问有多少种取法。

分析:分治、组合数学。F(n) = C(n,1)*1 + C(n,2)*2 + ... = sum(C(n,i)*i)

            推导:C(n,i)*i=n*...*(i+1)/ [i*(i-1)*...*1] * i=n * [(n-1)*...*i]/ [i*...*1]=C(n-1,i)*n

                         F(n)= n*sum(C(n-1,i))= n * 2^(n-1)

            利用快速幂求解即可。

说明:使用long long防止溢出;用%I64d竟然PE(⊙_⊙)。

#include <iostream>
#include <cstdlib>
#include <cstdio>

using namespace std;

long long N,MOD = 1000000007;

long long spow( long long x, long long n )
{
	if ( n == 0LL ) return 1LL;
	if ( n == 1LL ) return x%MOD;
	long long v = spow( x, n/2LL );
	if ( n%2LL == 1LL ) 
		return ((v*v)%MOD*x)%MOD;
	else return (v*v)%MOD;
}

int main()
{
	int T;
	while ( cin >> T )
	for ( int t = 1 ; t <= T ; ++ t ) {
		cin >> N;
		printf("Case #%d: %lld\n",t,spow(2LL,N-1LL)*N%MOD);
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值