专栏文章
P14514 [NFLSPC #8] 如何区分北京东路和北京东路
P14514题解参与者 2已保存评论 1
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @min6wxvj
- 此快照首次捕获于
- 2025/12/01 21:33 3 个月前
- 此快照最后确认于
- 2025/12/01 21:33 3 个月前
题号留念。
Analysis
由于操作是线性的,我们可以直接分析期望值的演化。
观察到每次重新分配后,威力总和不变。设 表示第 次爆炸后城市 的威力期望值。考虑一次爆炸的期望变化:
- 如果选中城市 ,概率为 ,。
- 如果选中其他城市 ,概率为 ,。
因此:
化简得到:
令 。注意到 ,代入得:
因为总期望 是常数,等于初始总威力 ,递推简化为:
其中 ,。
解这个一阶线性递推,得到:
其中 ,。
Code
CPP#include <bits/stdc++.h>
using namespace std;
#define int long long
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0' && ch<='9')
x=x*10+ch-'0',ch=getchar();
return x*f;
}
const int maxN=1e6+5,mod=998244353;
int n,k,a[maxN];
int qpow(int x,int y,int p){ //快速幂
int r=1;
while(y){
if(y&1) (r*=x)%=p;
(x*=x)%=p;
y>>=1;
}
return r;
}
int inv(int x,int p){ //除法转化为乘逆元
return qpow(x,p-2,p);
}
signed main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n>>k;
int s=0;
for(int i=1;i<=n;++i)
cin>>a[i],(s+=a[i])%=mod;
int p=(n-2+mod)%mod*inv(n-1,mod)%mod;
int ppowk=qpow(p,k,mod);
int sdivn=s*inv(n,mod)%mod;
for(int i=1;i<=n;++i)
cout<<(ppowk*a[i]%mod+sdivn*(1-ppowk+mod)%mod)%mod<<" ";
return 0;
}
时间复杂度 。
Ending
本题考查的数学知识为期望的概念,即每种情况的概率乘上答案然后求和,推导出线性的递推关系,通过发现总威力守恒简化式子。希望大家能通过此题和题解更好地掌握期望相关题目。
还有(最重要的):十年 OI 一场空,不开【】见祖宗!!
相关推荐
评论
共 1 条评论,欢迎与作者交流。
正在加载评论...