牛客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\n",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;\n",i,j,k,ans[i][j][k]); } //printf("%lld\n",ans); return 0; }