题目链接
题面:
题意: 给定一张纸,等概率的左右对折或者上下对折,对折 n n n 后,我沿着垂直轴剪一刀,沿着水平轴剪一刀,会分为多个碎片,问碎片个数的期望 。
题解: 我们转换一下模型,如果一次也不折叠,相当于竖着剪了一刀,横着剪了一刀。 每左右折叠一次,都相当于竖着剪的次数翻倍;每上下折叠一次,相当于横着剪得次数翻倍。
如果 n n n 次中有 i i i 次是左右折叠的,那么最终的碎片总数应该为 ( 2 i + 1 ) ∗ ( 2 n − i + 1 ) (2^i+1)*(2^{n-i}+1) (2i+1)∗(2n−i+1)
所以,期望为 1 2 n ∗ ∑ i = 1 n C n i ( 2 i + 1 ) ∗ ( 2 n − i + 1 ) \frac{1}{2^n}*\sum\limits_{i=1}^nC_n^i(2^i+1)*(2^{n-i}+1) 2n1∗i=1∑nCni(2i+1)∗(2n−i+1)
可以化简为: 1 2 n ∗ ( 2 2 ∗ n + 2 n + 2 ∗ 3 n ) \frac{1}{2^n}*(2^{2*n}+2^n+2*3^n) 2n1∗(22∗n+2n+2∗3n)
代码:
#include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> #include<cmath> #include<string> #include<queue> #include<bitset> #include<map> #include<unordered_map> #include<unordered_set> #include<set> #include<ctime> #define ui unsigned int #define ll long long #define llu unsigned ll #define ld long double #define pr make_pair #define pb push_back #define lc (cnt<<1) #define rc (cnt<<1|1) #define len(x) (t[(x)].r-t[(x)].l+1) #define tmid ((l+r)>>1) #define fhead(x) for(int i=head[(x)];i;i=nt[i]) #define max(x,y) ((x)>(y)?(x):(y)) #define min(x,y) ((x)>(y)?(y):(x)) using namespace std; const int inf=0x3f3f3f3f; const ll lnf=0x3f3f3f3f3f3f3f3f; const double dnf=1e18; const double alpha=0.75; const int mod=998244353; const double eps=1e-8; const double pi=acos(-1.0); const int hp=13331; const int maxn=1100; const int maxm=100100; const int maxp=100100; const int up=1100; ll mypow(ll a,ll b) { ll ans=1; b%=mod-1; while(b) { if(b&1) ans=ans*a%mod; a=a*a%mod; b>>=1; } return ans; } int main(void) { int tt; scanf("%d",&tt); while(tt--) { ll n; scanf("%lld",&n); printf("%lld\n",(mypow(2,2*n)+mypow(2,n)+2*mypow(3,n))*mypow(mypow(2,n),mod-2)%mod); } return 0; }