• 2020杭电多校 5I / HDU 6822


    HDU 6822 - Paperfolding


    题意

    将一张纸折(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;
    }
    

  • 相关阅读:
    数据库分页
    oracle查询某一个字段的数量总和
    JSON.stringify()和JSON.parse()
    oracle查询以当前年份为准的近些年数据
    关于oracle中日期使用
    最简单的js确认框!
    oracle插入数据时解决和旧数据id的冲突
    CentOS查看内核版本,位数,版本号
    CentOS 使用命令设置代理
    CentOS 编译源码安装MySQL-5.6.16
  • 原文地址:https://www.cnblogs.com/stelayuri/p/13435083.html
Copyright © 2020-2023  润新知