列表

详情


NC251500. coin

描述

题目背景

 假如我那时握住的不是硬币,而是 ...

题意简述

Rikka 和 Yuuta 在玩游戏,每一次他们会抛一枚硬币,正面向上的概率是 p,反面向上的概率是 1-p。若硬币掷出正面,那么这局 Rikka 获胜,否则 Yuuta 获胜。

在任意时刻,如果存在一个时间段,使得在该时间段内某个人比另个人多获胜 n 次,那么这个人赢得游戏,游戏结束。(例如 n=3,硬币掷出 反反正正反正正,在时刻 7 Rikka 获胜)

求出 Rikka 获胜的概率。

输入描述

第一行一个整数 T,表示询问组数。

接下来 T 行,每行两个整数 n,p 表示一组询问。

输出描述

输出 T 行,每行一个整数表示答案在模 998244353 意义下的值,可以证明答案在模意义下存在。

示例1

输入:

2
233 634336464
59093912 743410448

输出:

60595366
392543410

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 194ms, 内存消耗: 1296K, 提交时间: 2023-08-12 10:20:01

#include<iostream>
#include<string>
#include<algorithm>
#include<queue>
using namespace std;
#define ll long long
const int N=300005;
const ll mod=998244353;
ll qpow(ll a,ll b){
	ll ans=1;
	if(b==0)
	return 1;
	if(b%2)
	ans=a;
	ll t=qpow(a,b/2);
	return t*t%mod*ans%mod;
}
ll inv(ll a){
	return qpow(a,mod-2);
}
void solve(){
	ll n,p;
    cin>>n>>p;
    ll q=(mod+1-p)%mod;
    ll s=p*inv(q)%mod;
    s=inv(s);
    if(s==1){
        cout<<inv(2)<<'\n';
        return;
    }
    ll ans=n*qpow(s,n)%mod*(s-1)%mod*inv(qpow(s,n+1)-1)%mod*inv(qpow(s,n)-1)%mod;
    ll ans2=inv(qpow(s,n+1)-1)%mod;
    ans=(ans-ans2+mod)%mod;
    cout<<ans;
    cout<<'\n';
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	
	int t0;
	cin>>t0;
	for(int t=0;t<t0;t++){
		solve();
	}
}

上一题