2020 Multi-University Training Contest 5---- HDU--6822、Paperfolding (期望)

题目链接

题面:
在这里插入图片描述

题意:
给定一张纸,等概率的左右对折或者上下对折,对折 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)(2ni+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) 2n1i=1nCni(2i+1)(2ni+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(22n+2n+23n)

代码:

#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;
}



©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页