Sgu282 Isomorphism

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Sgu282 Isomorphism相关的知识,希望对你有一定的参考价值。

?????????rip   ?????????   ??????   ??????   ?????????   ??????   put   mat   getc   

Description
????????????N ?????????????????????????????? ?????????????????????????????????????????? ?????????????????? M ????????????????????????????????????????????????????????????????????????????????? ??????????????????????????????????????????????????????????????????????????????????????????????????????
??? ???????????????????????????????????? ?????????????????????????????????????????????????????????????????? mod P???P ???????????????N ?????????

Input
???????????????????????????N???M???P???
1???N???53???1???M???1000

Output
?????????????????????????????? mod P ????????????

Sample Input
3 4 97

Sample Output
20

polya?????????????????????????????????????????????????????????

????????????TM??????????????????????????????????????????????????????????????????????????????????????????????????????

?????????????????????????????????????????????

????????????????????????polya??????????????????????????????\(N!\)???????????????????????????????????????????????????????????????????????????????????????

?????????????????????????????????

  • ???\(i\)??????\(j\)????????????????????????\(L\)????????????????????????????????????\((i,j)\)??????????????????????????????????????????\(\lfloor\frac{L}{2}\rfloor\)???????????????????????????????????????????????????
  • ???\(i\)??????\(j\)????????????\(L_{i}\)???\(L_{j}\)?????????????????????????????????????????????\((i,j)\)??????????????????????????????\(lcm(L_{i},L_{j})\)

?????????\(L_{1}\geqslant L_{2}\geqslant ...\geqslant L_{m}>0\)?????????\(L_{1}+L_{2}+...+L_{m}=N\)????????????\(L_{i}\)??????\(N\)?????????????????????????????????????????????\(L_{i}\)???????????????

??????\(N\leqslant 53\)????????????\(N\)???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????

???????????????????????????????????????????????????

???????????????????????????\(L_{1}\geqslant L_{2}\geqslant ...\geqslant L_{m}>0\)???????????????????????????\(1...N\)???\(N\)?????????????????????\(m\)???????????????????????????\(i\)???????????????\(L_{i}\)????????????????????????????????????????????????\(\dfrac{N!}{L_{1}!L_{2}!...L_{m}!}\)??????????????????

????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????\((L_{1}-1)!(L_{2}-1)!...(L_{m}-1)!\)

?????????\(L_{i}=L_{i+1}=...=L_{j}\)??????????????????\((j-i+1)!\)?????????????????????????????????????????????\((j-i+1)!\)

???????????????????????????
\[\frac{N!}{L_{1}L_{2}...L_{m}k_{1}!k_{2}!...k_{t}!}\]

?????????\(t\)?????????\(t\)????????????\(L\)??????????????????\(k_{i}\)???

???????????????????????????????????????????????????

/*program from Wolfycz*/
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define inf 0x7f7f7f7f
using namespace std;
typedef long long ll;
typedef unsigned int ui;
typedef unsigned long long ull;
inline int read(){
    int x=0,f=1;char ch=getchar();
    for (;ch<???0???||ch>???9???;ch=getchar())    if (ch==???-???)    f=-1;
    for (;ch>=???0???&&ch<=???9???;ch=getchar())  x=(x<<1)+(x<<3)+ch-???0???;
    return x*f;
}
inline void print(int x){
    if (x>=10)     print(x/10);
    putchar(x%10+???0???);
}
const int N=1e3;
int fac[N+10],num[N+10],cnt[N+10];
int n,m,p,tot,Ans;
ll gcd(ll a,ll b){return !b?a:gcd(b,a%b);}
int mlt(ll a,ll b){
    int res=1;a%=p;
    for (;b;b>>=1,a=1ll*a*a%p)    if (b&1)    res=1ll*res*a%p;
    return res;
}
void dfs(int now,int left){
    if (!left){
        ll a=1,b=0;
        for (int i=1;i<=tot;i++){
            a=a*mlt(num[i],cnt[i])%p*fac[cnt[i]]%p; //????????????L???k!
            b+=cnt[i]*(cnt[i]-1)/2*num[i]+num[i]/2*cnt[i];
            //?????????gcd??????????????????k*(k-1)????????????????????????????????????????????????????????????
            for (int j=i+1;j<=tot;j++)   b+=cnt[i]*cnt[j]*gcd(num[i],num[j]);    //??????????????????????????????????????????????????????
        }
        a=1ll*mlt(a,p-2)*fac[n]%p;
        Ans=(Ans+1ll*a*mlt(m,b)%p)%p;
    }
    if (now>left)    return;
    dfs(now+1,left);    //??????????????????
    for (int i=1;i*now<=left;i++){//???????????????
        num[++tot]=now,cnt[tot]=i;
        dfs(now+1,left-i*now);
        tot--;
    }
}
int main(){
    n=read(),m=read(),p=read(),fac[0]=1;
    for (int i=1;i<N;i++)    fac[i]=1ll*fac[i-1]*i%p;
    //???????????????????????????k!
    dfs(1,n);
    Ans=1ll*Ans*mlt(fac[n],p-2)%p;  //??????
    printf("%d\n",Ans);
    return 0;
}

以上是关于Sgu282 Isomorphism的主要内容,如果未能解决你的问题,请参考以下文章

组合计数(polya计数):SGU 282 Isomorphism

BZOJ1478Sgu282 Isomorphism Pólya定理神题

bzoj1478 Sgu282 Isomorphism

SGU - 282

同态同构判定算法

ZOJ - 4089 :Little Sub and Isomorphism Sequences (同构 set)