J Roulette(“范式杯”2023牛客暑期多校训练营1)

目录

题目描述:

解题思路:

 解题代码:


题目描述:

J Roulette(“范式杯”2023牛客暑期多校训练营1)_第1张图片

解题思路:

 J Roulette(“范式杯”2023牛客暑期多校训练营1)_第2张图片

注:其中对于取模过程中用到了费马小定理,可参考如下博客:

(3条消息) 费马小定理及其应用_CTGU-Yoghurt的博客-CSDN博客

推算如下:J Roulette(“范式杯”2023牛客暑期多校训练营1)_第3张图片

 解题代码:

#include 
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
typedef double db;
typedef pair pii;
typedef pair pdd;

const int N=1e5+6;
const int M=998244353;

ll n,m;

ll qsm(ll x,ll p){
    ll res=1;
    while(p){
        if(p&1) res=res*x%M;
        x=x*x%M;
        p>>=1;
    }
    return res%M;
}

ll inv(ll x){
    return qsm(x,M-2);
}

int main(){
    cin>>n>>m;
    
    ll ans=1;
    for(ll i=n+1;i<=n+m;){
        ll lc=(ll)log2(i);
        ll gl=(1-inv(qsm(2,lc))+M)%M;//求一段区间内成功的概率
        ll r=min(n+m,(1ll<<(lc+1))-1);//区间的最右边 通过l找到右边的r
        ans=ans*qsm(gl,r-i+1)%M;//取一段区间
        i=r+1;//i指向下一段区间
    }
    cout<

你可能感兴趣的:(每日一题分享,算法,费马小定理,快速幂)