首页 > 其他 > 详细

UVa 11609 - Teams

时间:2014-07-28 15:47:43      阅读:332      评论:0      收藏:0      [点我收藏+]

题目: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;
}

UVa 11609 - Teams,布布扣,bubuko.com

UVa 11609 - Teams

原文:http://blog.csdn.net/mobius_strip/article/details/38229753

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!