P9419 [POI2021-2022R1] Układanie kart 题解
困难的。看了官方题解。
思路
把操作产生的排列之间的转化关系画成一棵内向树。下图是
可以找到规律:这棵树可以分成
然后官方题解从这里就开始飚式子了。我继续找规律。
下图是
这 些 是
在
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);
}