CF#324-B. Kolya and Tanya-组合数学题

http://codeforces.com/contest/584/problem/B

题意:给一个n,表示一张桌子坐了3*n个人

你要给每一个人发钱,可以发1,2,3块,第i个人的钱是ai  (i从0开始)

有一个要求:. If there is an integer i(0 ≤ i < n) such that ai + ai + n + ai + 2n ≠ 6, then Tanya is satisfied.

也就是只要有 一组that ai + ai + n + ai + 2n ≠ 6,  .就可以了

显然 ai  a(i+n) a(i+2n)是一个三角形....

对于n=1的时候,我们可以发现这个三角形有 20种情况符合条件,7种不符合条件;

当n为其他情况的时候,我们分成2种情况:

【1】 第一个三角形是20种的一种,那么剩下n-1个三角形 可以是27种情况任意一种。。  总方案数 20* 27^(n-1)

【2】第一个三角形是7种的一种,那么剩下n-1个三角形至少要有1个是符合要求的.

也就是有7  * (C(n-1,1)*(20^1)*(7^[n-1-1]) +  c(n-1,2)*(20^2)*(7^[n-1-2] )    + .....+c(n-1,n-1) * 20^(n-1)  )

后面部分就是二项式展开啦。。。所以最后是7* (20+7)^(n-1)  -C(n-1,0)*7^(n-1)  //减去全部不合法的情况 

答案就是【1】+【2】


#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <queue>
#include <map>
#include <set>
#include <vector>
using namespace std;


const __int64 mod =1000000007;

__int64 fast_m(__int64 a,__int64 b)
{
	__int64 x,ans=1;
	x=a;
	while(b)
	{
		if (b&1)
			ans=(ans*x)%mod;
		x=(x*x)%mod;
		b/=2;
	}
	return ans;
}  
int main()
{
	
	__int64 i;
	__int64 n;
	   scanf("%I64d",&n); 
	  /* if (n==1)
	   {
		   printf("20\n");
		   return 0; 
	   }
	   */
	   __int64 ans=(20*fast_m(27,n-1))%mod;
	   __int64 tmp= fast_m(20+7,n-1)-fast_m(7,n-1);
	   if (tmp<0)
		   tmp+=mod;

	   ans=(ans+7*tmp)%mod; 
	   
	   printf("%I64d\n",ans);
	   return 0;
	   
} 


你可能感兴趣的:(CF#324-B. Kolya and Tanya-组合数学题)