1 条题解
-
0
困难的。看了官方题解。
思路
把操作产生的排列之间的转化关系画成一棵内向树。下图是 的:

可以找到规律:这棵树可以分成 个部分,每个部分之间有代价为 的边相连。
然后官方题解从这里就开始飚式子了。我继续找规律。
下图是 的图的 。

这些是 的图的 。我把它们打印出来找到了规律:
在 棵大子树中,第 棵大子树的前 棵小子树与前 棵大子树完全一样,第 棵大子树的其余小子树都与第 棵大子树完全一样。
code
#include<stdio.h> #define int long long int n,mod,ans,pfxcnt,nowcnt,pfxans,nowans,fac; main() { scanf("%lld%lld",&n,&mod); if(n==2){putchar('1');return 0;} ans=1;pfxcnt=nowcnt=nowans=pfxans=1; for(int i=2;i<=n-2;++i) { nowans=(pfxans+nowans*(n-i)+nowcnt*((n-i+1)*(n-i)/2%mod))%mod; nowcnt=(pfxcnt+nowcnt*(n-i)+1)%mod; nowans=(nowans+nowcnt*i)%mod; pfxcnt=(pfxcnt+nowcnt)%mod; pfxans=(pfxans+nowans)%mod; ans=(ans+nowans)%mod; } fac=1;for(int i=2;i<n;fac=fac*i%mod,++i); printf("%lld",(ans*n+fac*((n-1ll)*n/2%mod)%mod*(n-1))%mod); }
- 1
信息
- ID
- 3419
- 时间
- 4000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者