arc111f
题目
思路:
直接做不好做,而max,min刚好对应大小关系,所以可以拆贡献,将数拆成小于当前数的个数
枚举分解点X
设p_{i,j}表示第j个数经过i次操作后大>=x的概率
则得:
\(f_{i,j} = (1-p_j) \cdot f_{i-1,j} + p_j \cdot \frac{(M-x) + M \cdot f_{i-1,j}}{2M+1}\)
p为j包含在区间内的概率
整理后为\(f_{i,j}=af_{i-1,j}+b\)的形式
而\(E_j=\sum \sum f_{i,j}*p*\frac {1}{2m+1}\)
先算\(\sum f_{i,j}\),第i个b对答案的贡献为\(b*(2^0+2^1+...+2^(q-1-i))\)
再用等比数列即可,然后后面推导一直用等比数列就可以了。
最终
\(E = \left( Q - \frac{1-a^Q}{1-a} \right) \cdot \frac{1}{1-a} \cdot \frac{p^2}{(2M+1)^2} \cdot \frac{M(M-1)}2\)
\(ans = E \times [方案数]\)
难点:
拆贡献
二次拆贡献
复杂的推式子,使我推了3遍才对
dp的设计
#include<bits/stdc++.h>
using namespace std;
struct FIO{static const int BUF_SIZE=1<<19;char _i[BUF_SIZE],*_1=_i,*_2=_i,_o[BUF_SIZE],*_t=_o;inline char _gt(){if(_1==_2){_1=_i;_2=_i+fread(_i,1,BUF_SIZE,stdin);}return _1==_2?EOF:*_1++;}inline void _pt(char c){if(_t-_o==BUF_SIZE){fwrite(_o,1,BUF_SIZE,stdout);_t=_o;}*_t++=c;}int _pr=6,le,_ob[20];template<typename T>FIO&operator>>(T&x){x=0;char c=_gt();bool sg=false;while(c!=EOF&&(c<'0'||c>'9')){if(c=='-')sg=true;c=_gt();}while(c!=EOF&&c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=_gt();}if(sg)x=-x;return*this;}FIO&operator>>(char*s){char c=_gt();while(c!=EOF&&c<33)c=_gt();while(c!=EOF&&c>=33)*s++=c,c=_gt();*s='\0';return*this;}FIO&operator>>(string&s){s.clear();char c=_gt();while(c!=EOF&&c<33)c=_gt();while(c!=EOF&&c>=33)s+=c,c=_gt();return*this;}FIO&operator>>(char&x){char c=_gt();while(c!=EOF&&c<33)c=_gt();x=c;return*this;}FIO&operator>>(double&x){x=0;char c=_gt();bool sg=0;while(c!=EOF&&c<33)c=_gt();if(c=='-'){sg=1;c=_gt();}while(c!=EOF&&c>='0'&&c<='9'){x=x*10+(c^48);c=_gt();}if(c=='.'){c=_gt();double tp=0.1;while(c!=EOF&&c>='0'&&c<='9'){x+=(c^48)*tp;tp*=0.1;c=_gt();}}if(sg)x=-x;return*this;}FIO&setprecision(int n){_pr=n<0?0:n;return*this;}template<typename T>FIO&operator<<(T x){if(x<0){_pt('-');x=-x;}if(x==0){_pt('0');return*this;}char _b[20];int ps=0;while(x>0){_b[ps++]=(x%10)^48;x/=10;}while(ps>0)_pt(_b[--ps]);return*this;}FIO&operator<<(const char*s){while(*s)_pt(*s++);return*this;}FIO&operator<<(const string&s){for(char c:s)_pt(c);return*this;}FIO&operator<<(char c){_pt(c);return*this;}FIO&operator<<(double x){if(x<0)_pt('-'),x=-x;if(isnan(x))return _pt('n'),_pt('a'),_pt('n'),*this;if(isinf(x))return _pt('i'),_pt('n'),_pt('f'),*this;long long ip=(long long)x;x-=ip;if(_pr==0){x*=10;if(x>=5)ip++;return*this<<ip;}le=0;_ob[0]=0;for(int i=1;i<=_pr;i++){x*=10;_ob[++le]=(int)x;x-=(int)x;}x*=10;int _tp=(int)x;if(_tp>=5){int j=le;_ob[le]++;while(_ob[j]==10)_ob[j-1]++,_ob[j]=0,j--;}ip+=_ob[0];*this<<ip<<".";for(int i=1;i<=le;i++)*this<<_ob[i];return*this;}~FIO(){fwrite(_o,1,_t-_o,stdout);}}fst;
#define cin fst
#define cout fst
#define il inline
#define mod 998244353
typedef long long ll;
ll n,m,q;
#define N 200005
il ll qpow(ll x,ll e){
x%=mod; ll res=1;
while(e){
if(e&1)res=res*x%mod;
x=x*x%mod;
e>>=1;
}
return res;
}
int main(){
cin>>n>>m>>q;
ll res=0;
ll i2m1=qpow(2*m+1,mod-2);
for(ll i=1;i<=n;i++){
ll p=i*(n-i+1)%mod*qpow(n*(n+1)/2,mod-2)%mod;
ll a=(1-(p*m%mod*i2m1%mod)+mod)%mod;
ll E=((q-((1-qpow(a,q)+mod)%mod*qpow((1-a+mod)%mod,mod-2)%mod)+mod)%mod)*qpow((1-a+mod)%mod,mod-2)%mod;
E=E*p%mod*p%mod*i2m1%mod*i2m1%mod;
E=E*m%mod*(m-1)%mod*qpow(2,mod-2)%mod;
res=((res+E)%mod+mod)%mod;
}
ll cnt=qpow((n*(n+1)/2)%mod*(m+m+1)%mod,q)%mod;
cout<<res%mod*cnt%mod;
return 0;
}

浙公网安备 33010602011771号