首页 > 其他分享 >P8229 [AGM 2022 资格赛] 抛硬币

P8229 [AGM 2022 资格赛] 抛硬币

时间:2022-11-09 10:02:03浏览次数:63  
标签:tmp AGM Matrix 1ll 2022 ans P8229 getchar mod

Link

直接推式子。

枚举第一次硬币反面朝下的位置。

\[\begin{aligned} E(n)&=\sum_{i=0}^{n-1} p^i(1-p)(k^i+E(n-i-1)) \\ &=\sum_{i=0}^{n-1} (pk)^i(1-p)+\sum_{i=0}^{n-1} p^i(1-p)E(n-i-1)\\ \end{aligned}\]

令 \(f(n)=\sum\limits_{i=0}^{n-1} (pk)^i(1-p),g(n)=\sum\limits_{i=0}^{n-1} p^i(1-p)E(n-i-1)\)

可得:

\[\begin{aligned}f(n)&=p\cdot k\cdot f(n-1)+(1-p)\\ g(n)&=(1-p)f(n-1)+g(n-1)\end{aligned}\]

然后这个式子可以矩阵加速。复杂度 \(\mathcal O(\log n)\)。可能需要卡常。

#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
using namespace std;
#define getchar getchar_unlocked
struct Ios{}io;
template <typename _tp>
Ios &operator >>(Ios &in,_tp &x){
    x=0;int w=0;char c=getchar();
    for(;!isdigit(c);w|=c=='-',c=getchar());
    for(;isdigit(c);x=x*10+(c^'0'),c=getchar());
    if(w) x=-x;
    return in;
}
typedef long long ll;
const int mod=998244353;
struct Matrix{
    int a[4][4];
    void clear(){
        a[1][1]=0;a[1][2]=0;a[1][3]=0;
        a[2][1]=0;a[2][2]=0;a[2][3]=0;
        a[3][1]=0;a[3][2]=0;a[3][3]=0;
    }
    void init(){
        a[1][1]=1;a[1][2]=0;a[1][3]=0;
        a[2][1]=0;a[2][2]=1;a[2][3]=0;
        a[3][1]=0;a[3][2]=0;a[3][3]=1;
    }
};
Matrix operator *(Matrix a,Matrix b){
    Matrix ans;ans.clear();
    ans.a[1][1]=(1ll*a.a[1][1]*b.a[1][1]+1ll*a.a[1][2]*b.a[2][1]+1ll*a.a[1][3]*b.a[3][1])%mod;
    ans.a[1][2]=(1ll*a.a[1][1]*b.a[1][2]+1ll*a.a[1][2]*b.a[2][2]+1ll*a.a[1][3]*b.a[3][2])%mod;
    ans.a[1][3]=(1ll*a.a[1][1]*b.a[1][3]+1ll*a.a[1][2]*b.a[2][3]+1ll*a.a[1][3]*b.a[3][3])%mod;
    ans.a[2][1]=(1ll*a.a[2][1]*b.a[1][1]+1ll*a.a[2][2]*b.a[2][1]+1ll*a.a[2][3]*b.a[3][1])%mod;
    ans.a[2][2]=(1ll*a.a[2][1]*b.a[1][2]+1ll*a.a[2][2]*b.a[2][2]+1ll*a.a[2][3]*b.a[3][2])%mod;
    ans.a[2][3]=(1ll*a.a[2][1]*b.a[1][3]+1ll*a.a[2][2]*b.a[2][3]+1ll*a.a[2][3]*b.a[3][3])%mod;
    ans.a[3][1]=(1ll*a.a[3][1]*b.a[1][1]+1ll*a.a[3][2]*b.a[2][1]+1ll*a.a[3][3]*b.a[3][1])%mod;
    ans.a[3][2]=(1ll*a.a[3][1]*b.a[1][2]+1ll*a.a[3][2]*b.a[2][2]+1ll*a.a[3][3]*b.a[3][2])%mod;
    ans.a[3][3]=(1ll*a.a[3][1]*b.a[1][3]+1ll*a.a[3][2]*b.a[2][3]+1ll*a.a[3][3]*b.a[3][3])%mod;
    return ans;
}
Matrix ans;
int main(){
    int T;io>>T;
    while(T--){
        ll n,k,p;io>>n>>k>>p;
        ans.init();
        Matrix tmp;tmp.clear();
        tmp.a[1][1]=p*k%mod;tmp.a[1][2]=(1-p+mod)%mod;
        tmp.a[2][2]=1;
        tmp.a[3][1]=(1-p+mod)%mod;tmp.a[3][3]=1;
        while(n){
            if(n&1) ans=ans*tmp;
            n>>=1;tmp=tmp*tmp;
        }
        Matrix x;x.clear();
        x.a[1][3]=1;
        ans=x*ans;
        printf("%d\n",(ans.a[1][1]+ans.a[1][2])%mod);
    }
    return 0;
}

标签:tmp,AGM,Matrix,1ll,2022,ans,P8229,getchar,mod
From: https://www.cnblogs.com/pref-ctrl27/p/16872501.html

相关文章

  • 祥云杯2022-部分pwn复现
    1.bitheap2.27限制数量0xf、限制大小0x200、无UAFadd:存在一个off-by-oneedit:输入内容时,edit会把2进制转成16进制然后按位取反foriinrange(12): add(i,0xf8)f......
  • DASCTF X GFCTF 2022十月挑战赛 pwn R()P
    R()P⾼版本上GCC编译的程序,没有csu这种好⽤的gadget可以⽤由于是优化过的编译,没有rbp链,⻓度参数通过rsp取得,地址通过rax取得这就给了我们直接控制read的可能,可以直接......
  • 2022-11-08 行情启动时的拐点,上下上形成了奔走中枢或者线段走势
    案例一:先看今天纳斯达克的一小段上涨1分钟的一段下上下走势引出的5分钟一笔上涨  案例2:EUR/USD 一开始的启动1.4h下跌终于出现最后一跌2.30分钟出现横盘整......
  • 组帧封包-20221108
    42byteaddress=Convert.ToByte(tbxAddress.Text.Trim(),16);//地址码43bytecmd=Convert.ToByte(tbxCmd.Text.Trim()......
  • 2022-11-8学习内容
    1.案例-购物车-商品列表展示1.1MyApplication.javapackagecom.example.chapter06;importandroid.app.Application;importandroid.content.res.Configuration;imp......
  • 2022.11.8(软件工程y实验一)
    1)回顾你过去将近3年的学习经历当初你报考的时候,是真正喜欢计算机这个专业吗?你现在后悔选择了这个专业吗?你认为你现在最喜欢的领域是什么(可以是计算机的也可以是其它领......
  • 2022.11.8
    ###csp模拟##出错点t1:for(intj=st;j*p[i]<=r;j++){if(vv[j*p[i]-l])continue;//不减l就超了!vv[j*p[i]-l]=p[i];} 没有考虑......
  • CSP-S 2022 题解
    A假期计划若\(u\)转车不超过\(k\)次可以到达\(v\),相当于\(u\leadstov\)的最短路长度不超过\(k+1\)。对于每个点\(u\),我们首先预处理满足如下条件的点\(v\)......
  • #yyds干货盘点#【愚公系列】2022年11月 微信小程序-导航(功能页)
    前言functional-page-navigator组件:是一个非常强大的组件,用于跳转插件的功能页,主要的参数如下:属性类型默认值必填说明最低版本versionstringrelease否......
  • 【2022-11-08】Git使用
    一、Git介绍#Git简介Git是一款免费、开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。Git是一个开源的分布式版本控制系统,可以有效、高速的处理从很......