2020 Multi-University Training Contest 5

1001 Tetrahedron

2020 Multi-University Training Contest 5_第1张图片

首先,a,b,c都是随机出自同一个区间,所以a,b,c的期望都相同,所以底面三角形为等边三角形,所以 h 的另一端为三角形的重心,然后就可以求出 1 h 2 = 3 c 2 \frac{1}{h^2} =\frac{3}{c^2} h21=c23,所以求出 1 c 2 \frac{1}{c^2} c21 的期望即可,注意此时求期望的数组是 [ 1 , 1 4 , 1 9 … 1 n 2 ] [1,\frac{1}{4},\frac{1}{9}…\frac{1}{n^2}] [1,41,91n21],然后按定义求期望:提出1/n的公因子后,预处理出前n项和即可。

#include
using namespace std;
typedef long long LL;
const int mod = 998244353;
const int N = 6e6+7;

int inv[N];
int sum[N];

void init()
{
	inv[1] = 1;
	for(int i=2;i<N;i++) 
	inv[i] = (LL)(mod-mod/i)*inv[mod%i]%mod;   //预处理逆元,注意 LL
 	for(int i=1;i<N;i++)
	sum[i] = (sum[i-1] + (LL)inv[i]*inv[i]%mod)%mod;  //提出公因数后预处理 ,注意 LL
}

int main()
{	init();
	int T;
	scanf("%d",&T);
	while(T--){
		int n;
		scanf("%d",&n);
		printf("%d\n",((LL)3*sum[n]*inv[n]+mod)%mod);  // 最后再/n
	}
	return 0;
}

1009 Paperfolding

2020 Multi-University Training Contest 5_第2张图片
四种操作其实两两对称,所以就考虑上下和左右对折,仔细考虑后发现其实两种对折产生的卡片数是相互独立的。
假如我们上下对折 k k k 次 ,然后水平切一刀后会产生 2 k 2^k 2k 个切痕,那么就产生了 2 k + 1 2^k+1 2k+1 个卡片,左右对折也同理。
所以对于 k k k 次上下对折, n − k n-k nk 次左右对折切割后产生的卡片数: ( 2 k + 1 ) ∗ ( 2 n − k + 1 ) (2^k+1)*(2^{n-k}+1) (2k+1)(2nk+1) 。并且两种对折的顺序对结果没有影响
考虑到概率,对于“总共要折n次,横向折k次”,也就是在所有折的次数中取 k k k次是横向折的,所以出现的次数可以表示成 C n k C_{n}^{k} Cnk
又因为折法总共分成了横向与竖向,所以总共的情况数为 2n
所以期望值就是: ∑ k = 0 n C n k ( 2 k + 1 ) ( 2 n − k + 1 ) 2 n \sum_{k=0}^{n}\frac{C_n^k(2^k+1)(2^{n-k}+1)}{2^n} k=0n2nCnk(2k+1)(2nk+1)
回忆两个式子:
1、 ( a + b ) n = ∑ i = 0 n ( C n i a i b n − i ) (a+b)^{n}=\sum_{i=0}^{n}(C_{n}^{i}a^{i} b^{n-i}) (a+b)n=i=0n(Cniaibni)
2、 2 n = ∑ i = 0 n C n i 2^n=\sum_{i=0}^{n} C_{n}^{i} 2n=i=0nCni
然后化简:先只考虑分子部分
将两个多项式合并,得到 ( 2 n + 1 + 2 k + 2 n − k ) (2^n+1+2^k+2^{n-k}) (2n+1+2k+2nk)
先考虑 ∑ k = 0 n C n k ( 2 n + 1 ) \sum_{k=0}^nC_n^k(2^n+1) k=0nCnk(2n+1)
由于 ∑ k = 0 n C n k = 2 n \sum_{k=0}^nC_n^k=2^n k=0nCnk=2n,所以该部分等价于 2 n ( 2 n + 1 ) 2^n(2^n+1) 2n(2n+1)
考虑 ∑ k = 0 n C n k ( 2 k + 2 n − k ) \sum_{k=0}^nC_n^k(2^k+2^{n-k}) k=0nCnk(2k+2nk)
分别乘上 1 n − k 1^{n-k} 1nk 以及 1k
得到 ∑ k = 0 n ( C n k 2 k 1 n − k + C n k 2 n − k 1 k ) \sum_{k=0}^n(C_n^k2^k1^{n-k}+C_n^k2^{n-k}1^k) k=0n(Cnk2k1nk+Cnk2nk1k)
合并二项式,得到 ( 2 + 1 ) n + ( 2 + 1 ) n = 2 × 3 n (2+1)^n+(2+1)^n=2\times3^n (2+1)n+(2+1)n=2×3n
所以整个期望值式子便化简到了 2 n ( 2 n + 1 ) + 2 × 3 n 2 n = 2 n + 1 + 2 × 3 n 2 n \frac{2^n(2^n+1)+2\times3^n}{2^n}=2^n+1+2\times\frac{3^n}{2^n} 2n2n(2n+1)+2×3n=2n+1+2×2n3n

#include
using namespace std;
typedef long long LL;
const int mod = 998244353;
const int N = 6e6+7;

LL quick(LL a,LL b){
	LL ans=1;
	while(b){
		if(b&1) ans = ans*a%mod;
		a = a*a%mod;
		b>>=1;
	}
	return ans;
}

int main()
{	
	int T;
	scanf("%d",&T);
	while(T--){
		LL n;
		scanf("%lld",&n);
		printf("%d\n",(quick(2,n)+1+2*quick(3,n)*quick(quick(2,n),mod-2)%mod+mod)%mod);
	}
	return 0;
}

你可能感兴趣的:(HDU)