题意
将一张纸折(n)次,四个方向都可以折
折完后取中点,横竖分别切一刀(切十字)
问最后纸被分成的数量的期望(模(998244353))
思路
可以发现,从左往右与从右往左对答案的影响相同
同理从上往下和从下往上也是相同的
所以四种情况可以合成等概率的两种情况考虑(横向与竖向)
可以发现,如果往同一个方向折(k)次,对于展开后的纸张在对应方向会出现(2^k)条割线,那么纸将会被分为(2^k+1)份
假如当前纸总共要折(n)次,横向折(k)次,竖向则是(n-k)次
所以此时纸张会被分成((2^k+1)*(2^{n-k}+1))份
考虑到概率,对于“总共要折(n)次,横向折(k)次”,也就是在所有折的次数中取(k)次是横向折的,所以出现的次数可以表示成(C_{n}^{k})
又因为折法总共分成了横向与竖向,所以总共的情况数为(2^n)
故期望值就是(sum_{k=0}^{n}frac{C_n^k(2^k+1)(2^{n-k}+1)}{2^n})
先只考虑分子部分
将两个多项式合并,得到((2^n+1+2^k+2^{n-k}))
先考虑(sum_{k=0}^nC_n^k(2^n+1))
由于(sum_{k=0}^nC_n^k=2^n),所以该部分等价于(2^n(2^n+1))
考虑(sum_{k=0}^nC_n^k(2^k+2^{n-k}))
分别乘上(1^{n-k})以及(1^k)
得到(sum_{k=0}^n(C_n^k2^k1^{n-k}+C_n^k2^{n-k}1^k))
合并二项式,得到((2+1)^n+(2+1)^n=2 imes3^n)
所以整个期望值式子便化简到了(frac{2^n(2^n+1)+2 imes3^n}{2^n}=2^n+1+2 imesfrac{3^n}{2^n})
快速幂加逆元即可
代码
(202ms/1000ms)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=998244353;
ll qpow(ll a,ll n){
ll r=1;
a%=mod;
while(n)
{
if(n&1)
r=(r*a)%mod;
n>>=1;
a=(a*a)%mod;
}
return r;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
ll n;
scanf("%lld",&n);
ll n2=qpow(2,n),n3=qpow(3,n),inv2=qpow(n2,mod-2);
printf("%lld
",(n2+1+2*n3*inv2)%mod);
}
return 0;
}