P6858 深海少女与胖头鱼
好神秘的题。
思路
容易发现,我们对于两个有盾的一直操作会死循环,所以直接观察是很难的。
考虑朴素的写式子,设 \(f_{i,j}\) 为 \(i\) 个有盾的,\(j\) 个没盾的,期望操作几次,\(f_{i,j} = \frac{j}{i+j}\times f_{i,j-1}+\frac{i}{i+j}\times f_{i+j-1,1} + 1\)。
发现 \(n\) 很大,直接搞不好搞,发现第一个转移 \(f_{i,j-1}\) 反正 \(m\) 很小不管,主要看第二个转移。
\(f_{i,1} = \frac{1}{i+1}\times f_{i,0}+\frac{i}{i+1}\times f_{i,1} + 1\)。
wow,这个可以化简诶,同时乘 \(i+1\),在减一下,就可以得到
\(f_{i,1} = f_{i,0}+i+1\),\(f_{i,0} = f_{i-1,1}+1\),所以 \(f_{i,1} = f_{i-1,1}+i+2\)。
特别的 \(f_{0,1} = 1\)。
\(f_{i,j} = \frac{j}{i+j}\times f_{i,j-1}+\frac{i}{i+j}\times \left(\frac{(i+j)*(i+j-1)}{2}+2*(i+j-1)+1\right) + 1\)。
枚举 \(j\) 即可,复杂度 \(O(m)\)。
code
#include<bits/stdc++.h>
#define int long long
using namespace std;
#define getchar() (p1 == p2 && (p2 = (p1 = buf1) + fread(buf1, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++)
char buf1[1 << 23], *p1 = buf1, *p2 = buf1, ubuf[1 << 23], *u = ubuf;
namespace IO
{
template<typename T>
void read(T &_x){_x=0;int _f=1;char ch=getchar();while(!isdigit(ch)) _f=(ch=='-'?-1:_f),ch=getchar();while(isdigit(ch)) _x=_x*10+(ch^48),ch=getchar();_x*=_f;}
template<typename T,typename... Args>
void read(T &_x,Args&...others){Read(_x);Read(others...);}
const int BUF=20000000;char buf[BUF],to,stk[32];int plen;
#define pc(x) buf[plen++]=x
#define flush(); fwrite(buf,1,plen,stdout),plen=0;
template<typename T>inline void print(T x){if(!x){pc(48);return;}if(x<0) x=-x,pc('-');for(;x;x/=10) stk[++to]=48+x%10;while(to) pc(stk[to--]);}
}
using namespace IO;
const int N = 1e6+10,mod = 998244353;
int n,m,ans;
inline int ksm(int x,int p)
{
int ans = 1; x %= mod;
while(p)
{
if((p&1)) ans = ans*x%mod;
x = x*x%mod;
p>>=1;
}
return ans;
}
signed main()
{
read(n),read(m); n%=mod,ans = (n*(n-1)%mod*ksm(2,mod-2)%mod+2*n)%mod;
for(int i = 1;i <= m;i++)
ans = (i*ksm(i+n,mod-2)%mod*ans%mod+n*ksm(i+n,mod-2)%mod*(((n+i)*(n+i-1)%mod*ksm(2,mod-2)%mod+2*(n+i-1)+1)%mod)%mod+1)%mod;
print(ans); flush();
return 0;
}
/*
f_{i,1} = f_{i,0}+1
f_{i,0} = f_{i-1,1}+i+1
f_{i,1} = f_{i-1,1}+i+2
f_{0,1} = 1
f_{i,j} = j/(i+j)*f_{i,j-1}+i/(i+j)*f_{i+j-1,1}+1
f_{i,j} = j/(i+j)*f_{i,j-1}+i/(i+j)*(2*(i+j-1)+1)+1
*/
浙公网安备 33010602011771号