2024.10.7 鲜花
【UNR #3】百鸽笼
花の塔
君が持ってきた漫画 くれた知らない名前のお花 今日はまだ来ないかな? 初めての感情知ってしまった 窓に飾った絵画をなぞってひとりで宇宙を旅して それだけでいいはずだったのに 君の手を握ってしまったら 孤独を知らないこの街には もう二度と帰ってくることはできないのでしょう 君が手を差し伸べた 光で影が生まれる 歌って聞かせて この話の続き 連れて行って見たことない星まで 誰の手も声も届かない 高く聳え立った塔の上へ 飛ばすフウセンカズラ 僕は君に笑って欲しいんだ 満たされない穴は惰性の会話や澄ましたポーズで これまでは埋めてきたけど 退屈な日々を蹴散らして 君と二人でこの街中を泳げたら それはどれだけ素敵なことでしょう? 出したことないほど大きな声でやっと君に伝わる 歪なくらいがさ きっとちょうどいいね 世界の端と端を結んで 窓に飾った絵画をなぞってひとりで宇宙を旅して それだけでも不自由ないけど 僕は選んでみたいの 高鳴る心 謎だらけの空を 安全なループを今、書き換えて! 君の手を握ってしまったら 孤独を知らないこの街にはもう二度と 帰ってくることはできないのでしょう いくらでも迷いながら光も影も見に行こう 歌って聞かせてこの話の続き 連れて行って見たことない星まで 世界の端と端を結んで
愿天堂没有疾病和伤痛
好题。
首先转化,每次从还有剩余的笼中选实在抽象,考虑可以继续放进去,只是没有贡献。
于是将题面转化为:给定一个无限长的序列,其元素是每堆鸽笼编号,对于每个
设当前处理的鸽笼编号为
考虑容斥,枚举子集,设
考虑求
因为是有序的,记得在转移时乘上
有了方案数,概率显然是
这样已经有了
考虑去掉指数,考虑转移过程,发现其只和
这里已经是
Code
#include<bits/stdc++.h> using namespace std; using llt=long long; using llf=long double; using ull=unsigned long long; #define endl '\n' #ifdef LOCAL FILE *InFile=freopen("in_out/in.in","r",stdin),*OutFile=freopen("in_out/out.out","w",stdout); #else FILE *InFile=stdin,*OutFile=stdout; #endif const int N=33,MOD=998244353; int c[N],n,m,fac[N*N],ivf[N*N],dp[N][N*N]; int Fpw(int a,int b){ int ans=1; while(b){ if(b&1) ans=1ll*ans*a%MOD; a=1ll*a*a%MOD,b>>=1; } return ans; } int Inv(int a){return Fpw(a,MOD-2);} int C(int a,int b){return 1ll*fac[a]*ivf[b]%MOD*ivf[a-b]%MOD;} void Del(int i){ for(int l=1;l<=n;++l) for(int j=0;j<=m;++j) for(int k=0;k<=min(j,c[i]-1);++k) dp[l][j]=(dp[l][j]-1ll*dp[l-1][j-k]*ivf[k]%MOD+MOD)%MOD; } void Add(int i){ for(int l=n;l;--l) for(int j=m;j>=0;--j) for(int k=0;k<=min(j,c[i]-1);++k) dp[l][j]=(dp[l][j]+1ll*dp[l-1][j-k]*ivf[k])%MOD; } int main(){ ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr); cin>>n; for(int i=1;i<=n;++i) cin>>c[i],m+=c[i]; fac[0]=1; for(int i=1;i<=m;++i) fac[i]=1ll*fac[i-1]*i%MOD; ivf[m]=Inv(fac[m]); for(int i=m;i;--i) ivf[i-1]=1ll*ivf[i]*i%MOD; dp[0][0]=1; for(int i=1;i<=n;++i) Add(i); for(int nw=1;nw<=n;++nw){ Del(nw); int ans=0; for(int j=0;j<n;++j){ int tmp=0; for(int k=0;k<=m-c[nw];++k) tmp=(tmp+1ll*dp[j][k]*fac[k]%MOD*C(c[nw]+k-1,k)%MOD*Inv(Fpw(j+1,k+c[nw]))%MOD)%MOD; ans=((ans+tmp*((j&1)?-1:1))%MOD+MOD)%MOD; } cout<<ans<<' '; Add(nw); } }
图,话说为什么这么多人喜欢用多个折叠,这个东西可以直接 F12 一键展开的 QwQ
本文来自博客园,作者:5k_sync_closer,转载请注明原文链接:https://www.cnblogs.com/xrlong/p/18450573
版权声明:本作品采用 「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC BY-NC-SA 4.0) 进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了