CodeChef - COUNTREL Count Relations

题目
题意: x x x y y y为两个只包含 1... N 1...N 1...N中数的集合,要求:在 x x x y y y不为另一个的子集的情况下,分别求:
1. x ∩ y = ∅ 1.x∩y=∅ 1.xy=
2. x ∩ y ≠ ∅ 2.x∩y≠∅ 2.xy̸=
的个数, ( x , y ) (x,y) (x,y) ( y , x ) (y,x) (y,x)算一组,所以方案数要除以 2 2 2
这可能是我唯一想出过的组合计数的问题吧
中间要用多次二项式定理,但只要知道公式应该就能化简出来了
#####1:
随便选 i ( 0 &lt; i &lt; n ) i(0&lt;i&lt;n) i(0<i<n)个点,为集合 x x x,剩下部分只要不全为空,随便填,为集合 y y y
方案数为: [ Σ i = 1 n − 1 C n i ⋅ ( 2 n − i − 1 ) ] / 2 = ( 3 n − 2 n + 1 + 1 ) / 2 [\Sigma_{i=1}^{n-1}C_n^i\cdot(2^{n-i}-1)]/2=(3^n-2^{n+1}+1)/2 [Σi=1n1Cni(2ni1)]/2=(3n2n+1+1)/2
#####2:
随便选 i ( 0 &lt; i &lt; n ) i(0&lt;i&lt;n) i(0<i<n)个点为公共部分,再在剩下部分中选 j ( 0 &lt; j &lt; n − i ) j(0&lt;j&lt;n-i) j(0<j<ni)个点,与公共部分一起并作 x x x,剩下部分随便填,与公共部分一起构成集合 y y y
方案数为:
[ Σ i − 1 n − 1 C n i Σ j = 1 n − i − 1 C n − i j ( 2 n − i − j − 1 ) ] / 2 = ( 4 n − 3 n + 1 + 3 ⋅ 2 n + 1 ) / 2 [\Sigma_{i-1}^{n-1}C_n^i\Sigma_{j=1}^{n-i-1}C_{n-i}^j(2^{n-i-j}-1)]/2=(4^n-3^{n+1}+3\cdot2^n+1)/2 [Σi1n1CniΣj=1ni1Cnij(2nij1)]/2=(4n3n+1+32n+1)/2

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int M=1e8+7;
int T;ll n,inv;
ll pw(ll x,ll y){
	ll z=1;
	for (;y;y>>=1,x=x*x%M)
		if (y&1) z=z*x%M;
	return z;
}
int main(){
	scanf("%d",&T);
	inv=pw(2,M-2);
	while (T--){
		scanf("%lld",&n);
		printf("%lld %lld\n",(pw(3,n)-pw(2,n+1)+1+M)%M*inv%M,
		(pw(4,n)-pw(3,n+1)+pw(2,n)*3%M-1+M*2)%M*inv%M);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值