ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

ABC226F Score of Permutations

2021-11-09 10:36:41  阅读:264  来源: 互联网

标签:ch int res Permutations jc ABC226F Score lcm mod


ABC226F Score of Permutations

Statement

F - Score of Permutations (atcoder.jp)

Solution

我们可以想到连边 \(i\to p_i\)

那么每一个点有出度 \(1\) ,最后显然会形成若干个环

于是,容易知道一个环的答案是它的长度,总的答案就是这若干个环长的 \(lcm\)

暴力枚举排列显然会炸掉,考虑 DP

设 \(dp[i][j]\) 表示使用 \(i\) 个点,现在形成的若干个环的 \(lcm=j\) ,的方案数,那么

\[dp[i+j][lcm^{\prime}=Lcm(lcm,j)]=\sum dp[i][lcm]*(j-1)!*\binom{n-i-1}{j-1} \]

即已经有 \(i\) 个点,新加入了一个 \(j\) 个点的环,对于环内的第一个点,下一个点有 \(j-1\) 种选择,\(\dots\) 。

那为什么是 \(\binom{n-i-1}{j-1}\) 而不是 \(\binom{n-i}{j}\) ? 考虑以下两种选法:

橙色表示先选,蓝色后选,但是实际上两者是一样的

所以我们每次选环的时候强制让起点是当前最小的一个点,即提前拿出一个点作为起点,所以需要 \(-1\)

Code

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod = 998244353;

int read(){
    int s=0,w=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
    while(ch>='0'&&ch<='9')s=s*10+ch-'0',ch=getchar();
    return s*w;
}

map<int,int>dp[55];
int jc[55];
int n,k,ans;

int ksm(int a,int b){
    int res=1;
    while(b)((b&1)&&(res=res*a%mod,1)),a=a*a%mod,b>>=1;
    return res;
}
int C(int n,int m){
    return jc[n]*ksm(jc[m],mod-2)%mod*ksm(jc[n-m],mod-2)%mod;
}
int gcd(int n,int m){return m?gcd(m,n%m):n;}
int lcm(int n,int m){return n/gcd(n,m)*m;}

signed main(){
    n=read(),k=read();
    for(int i=jc[0]=1;i<=n;++i)
        jc[i]=jc[i-1]*i%mod;
    dp[0][1]=1;
    for(int i=0;i<n;++i)
        for(int j=1;i+j<=n;++j)
            for(auto v:dp[i])
                (dp[i+j][lcm(v.first,j)]+=v.second*jc[j-1]%mod*C(n-i-1,j-1)%mod)%=mod;
    for(auto v:dp[n])
        (ans+=v.second*ksm(v.first,k)%mod)%=mod;
    printf("%lld\n",ans);
    return 0;
}

标签:ch,int,res,Permutations,jc,ABC226F,Score,lcm,mod
来源: https://www.cnblogs.com/wyb-sen/p/15526395.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有