显然:
设
A
[
i
]
[
j
]
位
i
只
鱼
没
圣
盾
,
j
只
鱼
有
圣
盾
则
转
移
为
A
[
i
]
[
j
]
=
(
A
[
1
]
[
i
+
j
−
1
]
+
1
)
∗
(
j
/
(
i
+
j
)
)
+
(
A
[
i
−
1
]
[
j
]
+
1
)
∗
(
i
/
(
i
+
j
)
)
[
i
>
=
1
且
转
移
(
1
)
要
求
[
j
>
=
2
]
]
设A[i][j]位i只鱼没圣盾,j只鱼有圣盾 \\ 则转移为\\ A[i][j] = (A[1][i + j - 1] + 1) * (j / (i + j))+(A[i - 1][j] + 1) * (i / (i + j))[i >= 1 且转移(1)要求[j>=2]]
设A[i][j]位i只鱼没圣盾,j只鱼有圣盾则转移为A[i][j]=(A[1][i+j−1]+1)∗(j/(i+j))+(A[i−1][j]+1)∗(i/(i+j))[i>=1且转移(1)要求[j>=2]]
对于
j
<
2
j < 2
j<2,有:
A
[
1
]
[
i
]
=
(
A
[
1
]
[
i
−
1
]
+
2
)
∗
(
1
/
(
i
+
1
)
)
+
(
A
[
1
]
[
i
−
1
]
+
1
)
∗
(
i
/
(
i
+
1
)
)
最
后
为
A
[
1
]
[
i
]
=
(
i
2
+
5
∗
i
+
2
)
/
2
30
p
t
s
G
E
T
s
\\ A[1][i] = (A[1][i - 1] + 2) * (1/ (i + 1)) + (A[1][i - 1] + 1) * (i / (i + 1)) \\ \\ 最后为 \\ A[1][i] = (i ^2 + 5 * i + 2) / 2 \\ 30ptsGETs
A[1][i]=(A[1][i−1]+2)∗(1/(i+1))+(A[1][i−1]+1)∗(i/(i+1))最后为A[1][i]=(i2+5∗i+2)/230ptsGETs
#include<bits/stdc++.h>
typedef unsigned long long ll;
using namespace std;
ll n,m,mod = 998244353;
ll mul(ll x , ll y){
ll zz = 0;
while(y){
if(y & 1)zz = (zz + x) % mod;
x = (x + x) % mod;
y = y >> 1;
}
return zz;
}
ll poww(ll x , ll y){
ll zz = 1;
while(y){
if(y & 1)zz = mul(zz , x);
x = mul(x , x);
y = y >> 1;
}
return zz;
}
int main(){
cin>>n>>m;
if(m == 0){
cout<<mul((mul(n , n) + mul(3 , n)) % mod , poww(2ll , mod - 2ll));
}
}
A
[
i
]
[
j
]
∗
(
i
+
j
)
=
(
A
[
1
]
[
i
+
j
−
1
]
+
1
)
∗
j
+
(
A
[
i
−
1
]
[
j
]
+
1
)
∗
i
发
现
j
时
独
立
的
因
为
第
一
项
可
以
O
(
1
)
A[i][j] * (i + j) = (A[1][i + j - 1] + 1) * j+(A[i - 1][j] + 1) * i \\ 发现j时独立的 因为第一项可以O(1)
A[i][j]∗(i+j)=(A[1][i+j−1]+1)∗j+(A[i−1][j]+1)∗i发现j时独立的因为第一项可以O(1)
然后这题就没有了
大部分做不了这题的人大概是卡在第一步了。。。。(包括我)
看我这菜的哟
#include<bits/stdc++.h>
#define MAXN 1000005
typedef unsigned long long ll;
using namespace std;
ll n,m,mod = 998244353,f[MAXN];
ll mul(ll x , ll y){
x %= mod;
y %= mod;
ll zz = 0;
while(y){
if(y & 1)zz = (zz + x) % mod;
x = (x + x) % mod;
y = y >> 1;
}
return zz;
}
ll poww(ll x , ll y){
ll zz = 1;
while(y){
if(y & 1)zz = mul(zz , x);
x = mul(x , x);
y = y >> 1;
}
return zz;
}
ll val(ll x){return mul((mul(x , x) + mul(5 , x) + 2) % mod , poww(2 , mod - 2));}
int main(){
cin>>n>>m;
f[0] = mul((mul(n , n) + mul(3 , n)) % mod , poww(2ll , mod - 2ll));
f[1] = val(n);
for(int i = 2 ; i <= m ; i++){
f[i] = mul(mul(f[i - 1] , i) + mul(val(i + n - 1) , n) + n + i ,
poww(i + n , mod - 2));
}
cout<<f[m]<<endl;
}