数论 + 概率论 - Paperfolding - HDU 6822

数论 + 概率论 - Paperfolding - HDU 6822

2020 Multi-University Training Contest 5

题意:

在这里插入图片描述

对 一 张 纸 进 行 n 次 操 作 , 对一张纸进行n次操作, n

每 次 操 作 允 许 横 向 对 折 或 者 竖 向 对 折 , 两 种 操 作 都 是 等 概 率 的 , 每次操作允许横向对折或者竖向对折,两种操作都是等概率的,

最 后 将 纸 片 横 向 平 分 剪 一 刀 , 竖 向 平 分 剪 一 刀 , 最后将纸片横向平分剪一刀,竖向平分剪一刀,

对 最 后 分 成 的 纸 片 数 量 计 算 数 学 期 望 。 答 案 对 998244353 取 模 。 对最后分成的纸片数量计算数学期望。答案对 998244353取模。 998244353

输入:

T 组 测 试 数 据 , T组测试数据, T

每 组 包 括 一 个 正 整 数 n 。 每组包括一个正整数n。 n

输出:

一 个 正 整 数 , 表 示 答 案 。 一个正整数,表示答案。

Sample Input

2
0
1

Sample Output

4
6

数据范围:

1 ≤ T ≤ 1 0 5 , 0 ≤ n ≤ 1 0 18 1≤T≤10^5,0≤n≤10^{18} 1T1050n1018


分析:

设 n 次 操 作 中 , 有 i 次 横 向 对 折 的 操 作 , 设n次操作中,有i次横向对折的操作, ni

则 最 终 能 够 将 纸 片 分 成 ( 2 i + 1 ) ( 2 n − i + 1 ) 块 。 则最终能够将纸片分成(2^i+1)(2^{n-i}+1)块。 (2i+1)(2ni+1)

记 X i 为 事 件 : 纸 被 横 向 对 折 i 次 后 , 最 终 被 分 成 的 小 纸 片 的 数 量 。 记X_i为事件:纸被横向对折i次后,最终被分成的小纸片的数量。 Xii

则 P ( X i ) = C n i ⋅ 1 2 n , 即 事 件 X i 发 生 的 概 率 。 则P(X_i)=C_n^i·\frac{1}{2^n},即事件X_i发生的概率。 P(Xi)=Cni2n1Xi

数 学 期 望 数学期望

E ( X ) = ∑ i = 0 n P ( X i ) ⋅ X i = 1 2 n ∑ i = 0 n C n i × ( 2 i + 1 ) ( 2 n − i + 1 ) = 1 2 n ∑ i = 0 n C n i ( 2 n + 2 i + 2 n − i + 1 ) E(X)=\sum_{i=0}^nP(X_i)·X_i=\frac{1}{2^n}\sum_{i=0}^nC_n^i×(2^i+1)(2^{n-i}+1)=\frac{1}{2^n}\sum_{i=0}^nC_n^i(2^n+2^i+2^{n-i}+1) E(X)=i=0nP(Xi)Xi=2n1i=0nCni×(2i+1)(2ni+1)=2n1i=0nCni(2n+2i+2ni+1)

根 据 二 项 式 定 理 : 根据二项式定理:

∑ i = 0 n C n i x i = ∑ i = 0 n C n i x i ⋅ 1 n − i = ( 1 + x ) n \sum_{i=0}^nC_n^ix^i=\sum_{i=0}^nC_n^ix^i·1^{n-i}=(1+x)^n i=0nCnixi=i=0nCnixi1ni=(1+x)n

故 : ∑ i = 0 n C n i 2 i = 3 n , ∑ i = 0 n C n i 2 − i = ( 1 + 1 2 ) n 故:\sum_{i=0}^nC_n^i2^i=3^n,\sum_{i=0}^nC_n^i2^{-i}=(1+\frac{1}{2})^n i=0nCni2i=3ni=0nCni2i=(1+21)n

最 终 答 案 : 最终答案:

1 2 n ∑ i = 0 n C n i ( 2 n + 2 i + 2 n − i + 1 ) = 1 2 n ( 4 n + 3 n + 2 n ( 1 + 1 2 ) n + 2 n ) \frac{1}{2^n}\sum_{i=0}^nC_n^i(2^n+2^i+2^{n-i}+1)=\frac{1}{2^n}(4^n+3^n+2^n(1+\frac{1}{2})^n+2^n) 2n1i=0nCni(2n+2i+2ni+1)=2n1(4n+3n+2n(1+21)n+2n)

代码:

#include<cstring>
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>

#define ll long long

using namespace std;

const int mod=998244353;

int T;
ll n;

ll quick_pow(ll a,ll b,int mod)
{
    ll res=1;
    b%=(mod-1);
    while(b)
    {
        if(b&1) res=res*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return res;
}

int main()
{   
    cin>>T;
    ll INV_2=quick_pow(2,mod-2,mod);
    while(T--)
    {
        scanf("%lld",&n);
        ll pow_2n=quick_pow(2,n,mod);
        ll pow_3n=quick_pow(3,n,mod);
        ll INV_p2=quick_pow(pow_2n,mod-2,mod);
        
        ll res=(pow_2n+1)*pow_2n%mod;
        res=(res+pow_3n)%mod;
        ll tmp=quick_pow(1+INV_2,n,mod)*pow_2n%mod;
        res=(res+tmp)%mod*INV_p2%mod;
        printf("%lld\n",res);
    }
    
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值