CF1866M
CF1866M
这篇题解较为详细地展示了 dp 式子的化简过程。
由于石子必须一个一个堆上去,所以设
分两种情况转移:掉到非零层,掉到第零层。
转移时考虑这次堆叠掉落到了那一层,初始
把
把第四项合并到第二项上(
将第三项的
把第三项合并到第二项上(即括号内的数相减),得到:
将第三项挪到左边,得到:
将
此时已经可以
发现
具体的,设
自行推导不难得出,
成功做到
#include<bits/stdc++.h>
using namespace std;
#define N 200005
#define mod 998244353
int n,a[N],p[105];
int f[N],g[105][N];
inline int add(int x,int y){return x+y>=mod?x+y-mod:x+y;}
inline int del(int x,int y){return x-y<0?x-y+mod:x-y;}
inline int qpow(int x,int y){int ret=1;for(;y;y>>=1,x=1ll*x*x%mod)if(y&1)ret=1ll*ret*x%mod;return ret;}
int main()
{
scanf("%d",&n);
int inv100=qpow(100,mod-2);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=0;i<100;i++) p[i]=1ll*i*inv100%mod;
for(int i=1;i<=n;i++)
{
if(i>1) for(int t=0;t<100;t++) g[t][i]=add(1ll*p[t]*g[t][i-1]%mod,1ll*p[t]*p[t]%mod*f[i-1]%mod);
f[i]=1ll*add(1,g[a[i]][i])*qpow(del(1,p[a[i]]),mod-2)%mod;
}
int ans=0;
for(int i=1;i<=n;i++) ans=add(ans,f[i]);
printf("%d",ans);
}