一、题目描述:
设
给定
答案对
二、解题思路:
一开始列出计算式个人感觉是最难的一步,后面化简多半就是套路了。
因为字典序相较于逆序对数要简单一些,所以我们先考虑字典序。
枚举排列
注意到前
对于后面
设
为什么这样设状态呢?因为我们对于每一个长度的
显而易见的,
注意这里枚举的
显然我们需要做到对
这里的转化比较有意思,将系数化来与枚举的系数相同(如
令
至此,我们可以
还有一点需要注意的就是
三、完整代码:
1 #include<iostream> 2 3 #define N 510 4 #define M 130000 5 #define ll long long 6 #define rep(i,l,r) for(ll i=l;i<=r;i++) 7 8 using namespace std; 9 10 ll n,mod,ans,fac[N],C[N][N]; 11 ll f[M<<1],s1[M<<1],s2[M<<1],g1[M<<1],g2[M<<1]; 12 13 void calc(ll x){ 14 15 ll lim=x*(x-1)/2,cnt=0; 16 17 rep(i,M-lim-x,M+lim+x){ 18 g1[i]=(g1[i-1]+f[i])%mod; 19 g2[i]=(g2[i-1]+f[i]*i)%mod; 20 } 21 22 rep(i,M-lim,M+lim){ 23 s1[i]=(x+i)*(g1[i+x]-g1[i])+g2[i]-g2[i+x]; 24 s2[i]=(x-i)*(g1[i]-g1[i-x])+g2[i]-g2[i-x]; 25 } 26 27 rep(i,M-lim,M+lim){ 28 s1[i]=(s1[i]%mod+mod)%mod; 29 s2[i]=(s2[i]%mod+mod)%mod; 30 } 31 32 rep(i,M+1,M+lim) (cnt+=s1[i])%=mod; 33 (ans+=C[n][n-x]*fac[n-x]%mod*cnt%mod)%=mod; 34 35 rep(i,M-lim,M+lim) f[i]=(s1[i]+s2[i])%mod; 36 37 } 38 39 signed main(){ 40 41 ios::sync_with_stdio(false); 42 cin.tie(0); cout.tie(0); 43 44 cin>>n>>mod; fac[0]=f[M]=1; 45 rep(i,1,n) fac[i]=fac[i-1]*i%mod; 46 47 rep(i,0,n) C[i][0]=1; 48 rep(i,0,n) rep(j,1,i) C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod; 49 50 rep(i,2,n) calc(i); 51 cout<<ans<<'\n'; 52 53 return 0; 54 55 }
四、写题心得:
感觉
并且掌握了新的推式子技巧和方法,很高兴。
忘了说,顺便水了一道蓝题,
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】