abc360 E题解 (AtCoder Beginner Contest 360)
E
对于位置2~n,它们的概率是相等的。
n*n个(x,y)对。其中x可以等于y。
对于x/y,y的逆元rev(y)为mul(y,mod-2)。
加、减、乘、除都可以做。比如48/9和16/3的结果是一样的,48*rev(9)%mod = 16*rev(3)%mod。比如3*rev(2)%mod = (rev(2)+rev(2)+rev(2))%mod.
对于每次操作,有多少概率黑球在位置1:
a. 黑球上次在位置1,这次不进行修改
概率:(n-1)*(n-1)+1 / n^2
b. 黑球上次在其它地方,这次移动到位置1
概率:2 / n^2
举个例子,以n为3为例,
(x,y)总共有1 1, 1 2, 1 3, 2 1, 2 2, 2 3, 3 1, 3 2, 3 3
对于a,有2 2, 2 3, 3 2, 3 3, 1 1。共5个
对于b,对于数字2,有2 1, 1 2, 对于数字3,有3 1, 3 2。共2个
递推式为:
注意n*n-2*n+2,要先取模,否则它再乘上其它数,有可能大于Long Long范围。
1 #include <bits/stdc++.h> 2 using namespace std; 3 #define LL long long 4 #define ULL unsigned long long 5 6 const LL mod=998244353; 7 8 const double eps_1=1e-5; 9 const double eps_2=1e-10; 10 11 const int maxn=1e5+10; 12 13 LL a[maxn]; 14 15 LL mul(LL x, LL y) 16 { 17 LL z=1; 18 while (y) 19 { 20 if (y&1) 21 z=z*x%mod; 22 x=x*x%mod; 23 y>>=1; 24 } 25 return z; 26 } 27 28 LL rev(LL x) 29 { 30 return mul(x,mod-2); 31 } 32 33 int main() 34 { 35 LL n,k,i,rev_n,one,other; 36 cin>>n>>k; 37 a[0]=1; 38 rev_n = rev(n); 39 for (i=1;i<=k;i++) 40 { 41 //n*n-2*n+2 放在前面 42 a[i] = ( (n*n-2*n+2) % mod *a[i-1] % mod + (1-a[i-1]+mod) * 2 % mod ) % mod 43 * rev_n % mod * rev_n % mod; 44 } 45 one = a[k]; 46 other = (1-one+mod) * rev(n-1) % mod; 47 cout << ( one + (n-1) * (2+n) % mod * rev(2) % mod * other % mod ) % mod; 48 49 return 0; 50 }
F
G
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
2019-07-02 代码评测
2019-07-02 Codeforces Round #563 (Div. 2) E. Ehab and the Expected GCD Problem