1 条题解

  • 0
    @ 2026-9-23 22:39:28

    困难的。看了官方题解。

    思路

    把操作产生的排列之间的转化关系画成一棵内向树。下图是 n=3,4n=3,4 的:

    可以找到规律:这棵树可以分成 nn 个部分,每个部分之间有代价为 n−1n-1 的边相连。

    然后官方题解从这里就开始飚式子了。我继续找规律。

    下图是 n=5n=5 的图的 15\frac 1 5。

    这些是n=6n=6 的图的 16\frac 1 6。我把它们打印出来找到了规律:

    在 n−2n-2 棵大子树中,第 ii 棵大子树的前 i−1i-1 棵小子树与前 i−1i-1 棵大子树完全一样,第 ii 棵大子树的其余小子树都与第 i−1i-1 棵大子树完全一样。

    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
    上传者