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

 

posted @ 2024-07-02 16:08  congmingyige  阅读(21)  评论(0编辑  收藏  举报