提交时间:2024-11-21 15:13:50

运行 ID: 35012

#include<bits/stdc++.h> using namespace std; #define ll long long #define fi first #define se second const int N=1e5+10,M=110,mod=1e9+7; int gcd(int a,int b){ if(a<b) swap(a,b); if(b==0) return a;return gcd(b,a%b); }int lcm(int a,int b){ return a*b/gcd(a,b); } struct dsu{ int fa[N],sz[N]; int fd(int x){ if(x==fa[x]) return x; return fa[x]=fd(fa[x]); }void mg(int x,int y){ x=fd(x),y=fd(y); if(x==y) return ; fa[x]=y;sz[y]+=sz[x]; } }dsu; int p[M];int n,m,rc=0; int siz[M]; int fac[N],inv[N]; map<int,int> ST[N]; int qp(int a,int b){ int x=1; while(b){ if(b&1) x=1ll*x*a%mod; b>>=1;a=1ll*a*a%mod; }return x; }int C(int u,int d){ if(u>d) return 0; return 1ll*fac[d]*inv[u]%mod*inv[d-u]%mod; } int a[N],ans=0; int main(){ cin>>n>>m; for(int i=1;i<=m;i++) cin>>p[i]; for(int i=1;i<=m;i++) dsu.fa[i]=i,dsu.sz[i]=1; for(int i=1;i<=m;i++) dsu.mg(p[i],i); for(int i=1;i<=m;i++) if(i==dsu.fd(i)) siz[++rc]=dsu.sz[i]; fac[0]=1;for(int i=1;i<=n;i++) fac[i]=1ll*fac[i-1]*i%mod; inv[n]=qp(fac[n],mod-2);for(int i=n-1;i>=0;i--) inv[i]=1ll*inv[i+1]*(i+1)%mod; ST[0][1]=1; for(int i=1;i<=n;i++){ for(auto j:ST[i-1]){ int lm=j.fi,vl=j.se; for(int k=1;k<=m;k++){ int sz=dsu.sz[dsu.fd(k)]; ST[i][lcm(sz,lm)]+=vl; ST[i][lcm(sz,lm)]%=mod; } } }for(auto j:ST[n]) ans=(ans+1ll*j.fi*j.se%mod)%mod; cout<<1ll*ans*qp(qp(m,n),mod-2)%mod; return 0; }