打卡信奥刷题(3223)用C++实现信奥题 P8307 〈 TREEのOI 2022 Spring 〉Absolutely Simple Game
P8307 〈 TREEのOI 2022 Spring 〉Absolutely Simple Game
题目背景
rin 和 len 在玩一个绝对简单的游戏,pcq 为裁判。
题目描述
初始时给定范围 [l,r]=[1,n][l,r]=[1,n][l,r]=[1,n],pcq 从中均匀随机选出一个自然数 ttt,之后 rin 和 len 两人轮流进行操作,rin 先行。
每次操作方猜测一个整数 x∈[l,r]x\in[l,r]x∈[l,r],若 x=tx=tx=t,则游戏结束,该方负;若 x<tx<tx<t,则调整范围 [l,r][l,r][l,r] 为 [x+1,r][x+1,r][x+1,r];若 x>tx>tx>t,则调整范围 [l,r][l,r][l,r] 为 [l,x−1][l,x-1][l,x−1]。
rin 和 len 两人均充分了解规则且无比可爱聪明(都会最大化自己的胜率),过程中谁都知道场上除了 ttt 以外的一切信息,求 rin 的胜率。
输入格式
一行一个整数 nnn。
输出格式
一行一个整数,表示 rin 的胜率,按分数 mod 998244353\bmod~998244353mod 998244353 输出。
输入输出样例 #1
输入 #1
3
输出 #1
665496236
说明/提示
样例解释1:
rin 的胜率为 23\dfrac 2332(一开始猜 222), mod 998244353\bmod~998244353mod 998244353 后输出为 665496236665496236665496236。
本题采用 SubTask 捆绑测试。
| SubTask 编号 | 分值 | 特殊限制 |
|---|---|---|
| 000 | 101010 | n≡0 (mod2)n\equiv 0\ \pmod 2n≡0 (mod2) |
| 111 | 202020 | n≤100n\le 100n≤100 |
| 222 | 303030 | n≤109n\le 10^9n≤109 |
| 333 | 404040 | n≤1018n\le 10^{18}n≤1018 |
对于 100%100\%100% 的数据,1≤n≤10181 \le n\le 10^{18}1≤n≤1018。
如何对有理数取模?
xy mod m\dfrac {x}{y} \bmod myxmodm 定义为 xym−2 mod mxy^{m-2}\bmod~mxym−2mod m。
mmm 必须为质数。
保证答案约分后分母不为 998244353998244353998244353 的倍数。
C++实现
#include<bits/stdc++.h>
#define mod 998244353
#define ll unsigned long long
using namespace std;
ll n;
ll mult(ll a,ll b){ //快速乘法
if(!b)return 0;
if(b==1)return a;
if(b&1)return (mult(a,b-1)+a)%mod;
return 2*mult(a,b/2)%mod;
}
ll power(ll a,ll b){ //快速幂
if(b==1)return a;
if(!b)return 1;
if(b&1)return mult(power(a,b-1),a)%mod;
ll buf=power(a,b/2);
return mult(buf,buf)%mod;
}
int main(){
cin>>n;
ll m=power(n,mod-2); //n的逆元
if(n%2==0)cout<<499122177<<endl; //这玩意儿就是0.5取模
else if(n%4==1)
cout<<mult((n-1),499122177)%mod*m%mod<<endl;
else if(n%4==3)
cout<<mult(n+1,499122177)%mod*m%mod<<endl;
return 0;
}

后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容
更多推荐

所有评论(0)