[HDU-6848] Expectation (2020多校7T5) (dp)
[HDU-6848] Expectation (2020多校7T5) (dp)
比赛时疯狂脑抽写了3个小时祭
考虑计算每条xi→xi+1的边被在所有情况下被经过的次数总和
令dp[i][j]为有i个球时,xj→xj+1这段被经过的次数总和(j≤2i)
考虑转移,对于dp[i],枚举每个球向左或者右走,发现把两边的部分拉拢过来后,合并形成一条包含了原先3条边的新边,变成了i−1阶的子问题
画图理解,发现j这条边,在i−1阶的子问题上对应的编号只可能是j,j−1,j−2
视选择了j这条边为将边一端的球滚进另一端的洞里
那么对于任意一条编号为j的边
j变为编号为j−2的情况为选择了编号[1,j−1]范围内的边
j变为编号为j−1的情况为选择了编号为j的边
j变为编号为j的情况为选择了编号为[j+1,2i]的边
对于j在子问题中被访问的次数可以直接O(1)继承过来
同时,考虑当第一次就选了j时,后面的操作随意,即加上(i−1)!⋅2i−1
于是得到一个O(n2)的dp预处理
而对于每个询问,求解n阶的答案复杂度为O(n)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define rep(i,a,b) for(int i=a,i##end=b;i<=i##end;++i)
char IO;
template <class T=int> T rd(){
T s=0; int f=0;
while(!isdigit(IO=getchar())) if(IO=='-') f=1;
do s=(s<<1)+(s<<3)+(IO^'0');
while(isdigit(IO=getchar()));
return f?-s:s;
}
const int N=3010,P=998244353;
int n;
int dp[N][N*2],Fac[N];
ll qpow(ll x,ll k=P-2) {
ll res=1;
for(;k;k>>=1,x=x*x%P) if(k&1) res=res*x%P;
return res;
}
int main(){
rep(i,Fac[0]=1,N-1) Fac[i]=1ll*i*Fac[i-1]%P;
dp[1][1]=dp[1][2]=1;
int t=1;
rep(i,2,N-1) {
t=1ll*t*(i-1)*2%P;
rep(j,1,i*2) {
dp[i][j]=(1ll*(i*2-j)*dp[i-1][j]+1ll*dp[i-1][j-1]+1ll*(j-1)*(j>=2?dp[i-1][j-2]:0)+t)%P;
}
}
rep(kase,1,rd()) {
n=rd();
int ans=0,x=rd();
rep(i,1,n*2) {
int y=rd();
ans=(ans+1ll*(y-x)*dp[n][i])%P;
x=y;
}
ans=ans*qpow((P+1)/2,n)%P*qpow(Fac[n])%P;
printf("%d\n",ans);
}
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· 程序员常用高效实用工具推荐,办公效率提升利器!
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 【译】WinForms:分析一下(我用 Visual Basic 写的)
2019-08-11 AtCoder Beginner Contest 137 F