牛客2020跨年场 D-衔尾蛇 组合数/polya定理

传送门

光、对立和小红三个人在玩捉蛇游戏。
已知蛇有三种:红蛇、蓝蛇和绿蛇。蛇可以咬住自己的尾巴,形成衔尾蛇。每条蛇可以咬住自己的尾巴,也可以咬住别的蛇的尾巴。
一共有a条红蛇,b条蓝蛇,c条绿蛇。她们想知道一共可以形成多少种不同的衔尾蛇的环?

注:蛇可以不用全部用完。

题解:

觉得应该是polya定理,但是没推出来公式...等一波官方正解

因为范围只有12,所以赛时的解法是预处理打表,对于蛇数量的每一种组合,枚举出全排列,然后对每个排列,暴力计算它的轮换有多少种,都加进答案里,最后把答案除以蛇总数。

#include<iostream>
#define LL long long
using namespace std;
int ans[13][13][13];
int main(){
    ans[0][0][1]=1;
    ans[0][0][2]=1;
    ans[0][0][3]=1;
    ans[0][0][4]=1;
    ans[0][0][5]=1;
    ans[0][0][6]=1;
    ans[0][0][7]=1;
    ans[0][0][8]=1;
    ans[0][0][9]=1;
    ans[0][0][10]=1;
    ans[0][0][11]=1;
    ans[0][0][12]=1;
    ans[0][1][0]=1;
    ans[0][1][1]=1;
    ans[0][1][2]=1;
    ans[0][1][3]=1;
    ans[0][1][4]=1;
    ans[0][1][5]=1;
    ans[0][1][6]=1;
    ans[0][1][7]=1;
    ans[0][1][8]=1;
    ans[0][1][9]=1;
    ans[0][1][10]=1;
    ans[0][1][11]=1;
    ans[0][2][0]=1;
    ans[0][2][1]=1;
    ans[0][2][2]=2;
    ans[0][2][3]=2;
    ans[0][2][4]=3;
    ans[0][2][5]=3;
    ans[0][2][6]=4;
    ans[0][2][7]=4;
    ans[0][2][8]=5;
    ans[0][2][9]=5;
    ans[0][2][10]=6;
    ans[0][3][0]=1;
    ans[0][3][1]=1;
    ans[0][3][2]=2;
    ans[0][3][3]=4;
    ans[0][3][4]=5;
    ans[0][3][5]=7;
    ans[0][3][6]=10;
    ans[0][3][7]=12;
    ans[0][3][8]=15;
    ans[0][3][9]=19;
    ans[0][4][0]=1;
    ans[0][4][1]=1;
    ans[0][4][2]=3;
    ans[0][4][3]=5;
    ans[0][4][4]=10;
    ans[0][4][5]=14;
    ans[0][4][6]=22;
    ans[0][4][7]=30;
    ans[0][4][8]=43;
    ans[0][5][0]=1;
    ans[0][5][1]=1;
    ans[0][5][2]=3;
    ans[0][5][3]=7;
    ans[0][5][4]=14;
    ans[0][5][5]=26;
    ans[0][5][6]=42;
    ans[0][5][7]=66;
    ans[0][6][0]=1;
    ans[0][6][1]=1;
    ans[0][6][2]=4;
    ans[0][6][3]=10;
    ans[0][6][4]=22;
    ans[0][6][5]=42;
    ans[0][6][6]=80;
    ans[0][7][0]=1;
    ans[0][7][1]=1;
    ans[0][7][2]=4;
    ans[0][7][3]=12;
    ans[0][7][4]=30;
    ans[0][7][5]=66;
    ans[0][8][0]=1;
    ans[0][8][1]=1;
    ans[0][8][2]=5;
    ans[0][8][3]=15;
    ans[0][8][4]=43;
    ans[0][9][0]=1;
    ans[0][9][1]=1;
    ans[0][9][2]=5;
    ans[0][9][3]=19;
    ans[0][10][0]=1;
    ans[0][10][1]=1;
    ans[0][10][2]=6;
    ans[0][11][0]=1;
    ans[0][11][1]=1;
    ans[0][12][0]=1;
    ans[1][0][0]=1;
    ans[1][0][1]=1;
    ans[1][0][2]=1;
    ans[1][0][3]=1;
    ans[1][0][4]=1;
    ans[1][0][5]=1;
    ans[1][0][6]=1;
    ans[1][0][7]=1;
    ans[1][0][8]=1;
    ans[1][0][9]=1;
    ans[1][0][10]=1;
    ans[1][0][11]=1;
    ans[1][1][0]=1;
    ans[1][1][1]=2;
    ans[1][1][2]=3;
    ans[1][1][3]=4;
    ans[1][1][4]=5;
    ans[1][1][5]=6;
    ans[1][1][6]=7;
    ans[1][1][7]=8;
    ans[1][1][8]=9;
    ans[1][1][9]=10;
    ans[1][1][10]=11;
    ans[1][2][0]=1;
    ans[1][2][1]=3;
    ans[1][2][2]=6;
    ans[1][2][3]=10;
    ans[1][2][4]=15;
    ans[1][2][5]=21;
    ans[1][2][6]=28;
    ans[1][2][7]=36;
    ans[1][2][8]=45;
    ans[1][2][9]=55;
    ans[1][3][0]=1;
    ans[1][3][1]=4;
    ans[1][3][2]=10;
    ans[1][3][3]=20;
    ans[1][3][4]=35;
    ans[1][3][5]=56;
    ans[1][3][6]=84;
    ans[1][3][7]=120;
    ans[1][3][8]=165;
    ans[1][4][0]=1;
    ans[1][4][1]=5;
    ans[1][4][2]=15;
    ans[1][4][3]=35;
    ans[1][4][4]=70;
    ans[1][4][5]=126;
    ans[1][4][6]=210;
    ans[1][4][7]=330;
    ans[1][5][0]=1;
    ans[1][5][1]=6;
    ans[1][5][2]=21;
    ans[1][5][3]=56;
    ans[1][5][4]=126;
    ans[1][5][5]=252;
    ans[1][5][6]=462;
    ans[1][6][0]=1;
    ans[1][6][1]=7;
    ans[1][6][2]=28;
    ans[1][6][3]=84;
    ans[1][6][4]=210;
    ans[1][6][5]=462;
    ans[1][7][0]=1;
    ans[1][7][1]=8;
    ans[1][7][2]=36;
    ans[1][7][3]=120;
    ans[1][7][4]=330;
    ans[1][8][0]=1;
    ans[1][8][1]=9;
    ans[1][8][2]=45;
    ans[1][8][3]=165;
    ans[1][9][0]=1;
    ans[1][9][1]=10;
    ans[1][9][2]=55;
    ans[1][10][0]=1;
    ans[1][10][1]=11;
    ans[1][11][0]=1;
    ans[2][0][0]=1;
    ans[2][0][1]=1;
    ans[2][0][2]=2;
    ans[2][0][3]=2;
    ans[2][0][4]=3;
    ans[2][0][5]=3;
    ans[2][0][6]=4;
    ans[2][0][7]=4;
    ans[2][0][8]=5;
    ans[2][0][9]=5;
    ans[2][0][10]=6;
    ans[2][1][0]=1;
    ans[2][1][1]=3;
    ans[2][1][2]=6;
    ans[2][1][3]=10;
    ans[2][1][4]=15;
    ans[2][1][5]=21;
    ans[2][1][6]=28;
    ans[2][1][7]=36;
    ans[2][1][8]=45;
    ans[2][1][9]=55;
    ans[2][2][0]=2;
    ans[2][2][1]=6;
    ans[2][2][2]=16;
    ans[2][2][3]=30;
    ans[2][2][4]=54;
    ans[2][2][5]=84;
    ans[2][2][6]=128;
    ans[2][2][7]=180;
    ans[2][2][8]=250;
    ans[2][3][0]=2;
    ans[2][3][1]=10;
    ans[2][3][2]=30;
    ans[2][3][3]=70;
    ans[2][3][4]=140;
    ans[2][3][5]=252;
    ans[2][3][6]=420;
    ans[2][3][7]=660;
    ans[2][4][0]=3;
    ans[2][4][1]=15;
    ans[2][4][2]=54;
    ans[2][4][3]=140;
    ans[2][4][4]=318;
    ans[2][4][5]=630;
    ans[2][4][6]=1160;
    ans[2][5][0]=3;
    ans[2][5][1]=21;
    ans[2][5][2]=84;
    ans[2][5][3]=252;
    ans[2][5][4]=630;
    ans[2][5][5]=1386;
    ans[2][6][0]=4;
    ans[2][6][1]=28;
    ans[2][6][2]=128;
    ans[2][6][3]=420;
    ans[2][6][4]=1160;
    ans[2][7][0]=4;
    ans[2][7][1]=36;
    ans[2][7][2]=180;
    ans[2][7][3]=660;
    ans[2][8][0]=5;
    ans[2][8][1]=45;
    ans[2][8][2]=250;
    ans[2][9][0]=5;
    ans[2][9][1]=55;
    ans[2][10][0]=6;
    ans[3][0][0]=1;
    ans[3][0][1]=1;
    ans[3][0][2]=2;
    ans[3][0][3]=4;
    ans[3][0][4]=5;
    ans[3][0][5]=7;
    ans[3][0][6]=10;
    ans[3][0][7]=12;
    ans[3][0][8]=15;
    ans[3][0][9]=19;
    ans[3][1][0]=1;
    ans[3][1][1]=4;
    ans[3][1][2]=10;
    ans[3][1][3]=20;
    ans[3][1][4]=35;
    ans[3][1][5]=56;
    ans[3][1][6]=84;
    ans[3][1][7]=120;
    ans[3][1][8]=165;
    ans[3][2][0]=2;
    ans[3][2][1]=10;
    ans[3][2][2]=30;
    ans[3][2][3]=70;
    ans[3][2][4]=140;
    ans[3][2][5]=252;
    ans[3][2][6]=420;
    ans[3][2][7]=660;
    ans[3][3][0]=4;
    ans[3][3][1]=20;
    ans[3][3][2]=70;
    ans[3][3][3]=188;
    ans[3][3][4]=420;
    ans[3][3][5]=840;
    ans[3][3][6]=1542;
    ans[3][4][0]=5;
    ans[3][4][1]=35;
    ans[3][4][2]=140;
    ans[3][4][3]=420;
    ans[3][4][4]=1050;
    ans[3][4][5]=2310;
    ans[3][5][0]=7;
    ans[3][5][1]=56;
    ans[3][5][2]=252;
    ans[3][5][3]=840;
    ans[3][5][4]=2310;
    ans[3][6][0]=10;
    ans[3][6][1]=84;
    ans[3][6][2]=420;
    ans[3][6][3]=1542;
    ans[3][7][0]=12;
    ans[3][7][1]=120;
    ans[3][7][2]=660;
    ans[3][8][0]=15;
    ans[3][8][1]=165;
    ans[3][9][0]=19;
    ans[4][0][0]=1;
    ans[4][0][1]=1;
    ans[4][0][2]=3;
    ans[4][0][3]=5;
    ans[4][0][4]=10;
    ans[4][0][5]=14;
    ans[4][0][6]=22;
    ans[4][0][7]=30;
    ans[4][0][8]=43;
    ans[4][1][0]=1;
    ans[4][1][1]=5;
    ans[4][1][2]=15;
    ans[4][1][3]=35;
    ans[4][1][4]=70;
    ans[4][1][5]=126;
    ans[4][1][6]=210;
    ans[4][1][7]=330;
    ans[4][2][0]=3;
    ans[4][2][1]=15;
    ans[4][2][2]=54;
    ans[4][2][3]=140;
    ans[4][2][4]=318;
    ans[4][2][5]=630;
    ans[4][2][6]=1160;
    ans[4][3][0]=5;
    ans[4][3][1]=35;
    ans[4][3][2]=140;
    ans[4][3][3]=420;
    ans[4][3][4]=1050;
    ans[4][3][5]=2310;
    ans[4][4][0]=10;
    ans[4][4][1]=70;
    ans[4][4][2]=318;
    ans[4][4][3]=1050;
    ans[4][4][4]=2896;
    ans[4][5][0]=14;
    ans[4][5][1]=126;
    ans[4][5][2]=630;
    ans[4][5][3]=2310;
    ans[4][6][0]=22;
    ans[4][6][1]=210;
    ans[4][6][2]=1160;
    ans[4][7][0]=30;
    ans[4][7][1]=330;
    ans[4][8][0]=43;
    ans[5][0][0]=1;
    ans[5][0][1]=1;
    ans[5][0][2]=3;
    ans[5][0][3]=7;
    ans[5][0][4]=14;
    ans[5][0][5]=26;
    ans[5][0][6]=42;
    ans[5][0][7]=66;
    ans[5][1][0]=1;
    ans[5][1][1]=6;
    ans[5][1][2]=21;
    ans[5][1][3]=56;
    ans[5][1][4]=126;
    ans[5][1][5]=252;
    ans[5][1][6]=462;
    ans[5][2][0]=3;
    ans[5][2][1]=21;
    ans[5][2][2]=84;
    ans[5][2][3]=252;
    ans[5][2][4]=630;
    ans[5][2][5]=1386;
    ans[5][3][0]=7;
    ans[5][3][1]=56;
    ans[5][3][2]=252;
    ans[5][3][3]=840;
    ans[5][3][4]=2310;
    ans[5][4][0]=14;
    ans[5][4][1]=126;
    ans[5][4][2]=630;
    ans[5][4][3]=2310;
    ans[5][5][0]=26;
    ans[5][5][1]=252;
    ans[5][5][2]=1386;
    ans[5][6][0]=42;
    ans[5][6][1]=462;
    ans[5][7][0]=66;
    ans[6][0][0]=1;
    ans[6][0][1]=1;
    ans[6][0][2]=4;
    ans[6][0][3]=10;
    ans[6][0][4]=22;
    ans[6][0][5]=42;
    ans[6][0][6]=80;
    ans[6][1][0]=1;
    ans[6][1][1]=7;
    ans[6][1][2]=28;
    ans[6][1][3]=84;
    ans[6][1][4]=210;
    ans[6][1][5]=462;
    ans[6][2][0]=4;
    ans[6][2][1]=28;
    ans[6][2][2]=128;
    ans[6][2][3]=420;
    ans[6][2][4]=1160;
    ans[6][3][0]=10;
    ans[6][3][1]=84;
    ans[6][3][2]=420;
    ans[6][3][3]=1542;
    ans[6][4][0]=22;
    ans[6][4][1]=210;
    ans[6][4][2]=1160;
    ans[6][5][0]=42;
    ans[6][5][1]=462;
    ans[6][6][0]=80;
    ans[7][0][0]=1;
    ans[7][0][1]=1;
    ans[7][0][2]=4;
    ans[7][0][3]=12;
    ans[7][0][4]=30;
    ans[7][0][5]=66;
    ans[7][1][0]=1;
    ans[7][1][1]=8;
    ans[7][1][2]=36;
    ans[7][1][3]=120;
    ans[7][1][4]=330;
    ans[7][2][0]=4;
    ans[7][2][1]=36;
    ans[7][2][2]=180;
    ans[7][2][3]=660;
    ans[7][3][0]=12;
    ans[7][3][1]=120;
    ans[7][3][2]=660;
    ans[7][4][0]=30;
    ans[7][4][1]=330;
    ans[7][5][0]=66;
    ans[8][0][0]=1;
    ans[8][0][1]=1;
    ans[8][0][2]=5;
    ans[8][0][3]=15;
    ans[8][0][4]=43;
    ans[8][1][0]=1;
    ans[8][1][1]=9;
    ans[8][1][2]=45;
    ans[8][1][3]=165;
    ans[8][2][0]=5;
    ans[8][2][1]=45;
    ans[8][2][2]=250;
    ans[8][3][0]=15;
    ans[8][3][1]=165;
    ans[8][4][0]=43;
    ans[9][0][0]=1;
    ans[9][0][1]=1;
    ans[9][0][2]=5;
    ans[9][0][3]=19;
    ans[9][1][0]=1;
    ans[9][1][1]=10;
    ans[9][1][2]=55;
    ans[9][2][0]=5;
    ans[9][2][1]=55;
    ans[9][3][0]=19;
    ans[10][0][0]=1;
    ans[10][0][1]=1;
    ans[10][0][2]=6;
    ans[10][1][0]=1;
    ans[10][1][1]=11;
    ans[10][2][0]=6;
    ans[11][0][0]=1;
    ans[11][0][1]=1;
    ans[11][1][0]=1;
    ans[12][0][0]=1;
    int a,b,c;
    scanf("%d %d %d",&a,&b,&c);
    int sum=0;
    for(int i=0;i<=a;i++)
    for(int j=0;j<=b;j++)
    for(int k=0;k<=c;k++){
        sum+=ans[i][j][k];
    }
    printf("%lld
",sum);
    
    return 0;
}
超级长的代码,你确定要看?

打表代码:

#include<iostream>
#include<algorithm>
#define LL long long
using namespace std;
int ans[13][13][13];
int distinc(int *a,int k){
    int ans=1;
    for(int i=1;i<k;i++){
        for(int j=0;j<k;j++){
            if(a[j]!=a[(j+i)%k])goto A;
        }
        ans++;
        A:;
    }
    return ans;
}
int main(){
    for(int i=0;i<=12;i++)
    for(int j=0;j<=12-i;j++)
    for(int k=0;k<=12-i-j;k++){
        if(i+j+k==0)continue;
        int sss[13];
        int t=i,sp=0;
        while(t){
            t--;
            sss[sp++]=1;
        }
        t=j;
        while(t){
            t--;
            sss[sp++]=2;
        }
        t=k;
        while(t){
            t--;
            sss[sp++]=3;
        }
        if(sp!=i+j+k)return 1;
        do{
            ans[i][j][k]+=distinc(sss,sp);
        }while(next_permutation(sss,sss+sp));
        ans[i][j][k]/=(i+j+k);
        printf("ans[%d][%d][%d]=%d;
",i,j,k,ans[i][j][k]);
    }
    //printf("%lld
",ans);
    
    return 0;
}
原文地址:https://www.cnblogs.com/isakovsky/p/14219431.html