T73432 秘籍-反复立体 (Polya定理)

模拟赛的时候一道优秀的 P o l y a Polya Polya的题
反正我对群论一无所知。
具体题面可以在洛谷团队硫代硫酸钠纠察大队找到2333

首先题目描述的这个几何体是阿基米德多面体之一,拥有 6 6 6个正方形, 8 8 8个正三角形
形如
T73432 秘籍-反复立体 (Polya定理)_第1张图片
看到旋转同构,能想到 P o l y a Polya Polya

一开始用一些奇奇怪怪的方法去计算,然后一直自闭。

后来换了一种比较好用的方法。

我们通过确定轴线,来数旋转会比较容易
首先来考虑不动置换,也就是旋转 0 ° 0° 0°

方案数就是 a 6 + b 8 a^6 + b^8 a6+b8

接下来考虑面心和面心的连线为轴
如果是正方形面,那么方案数就是
( q s m ( l y f , 2 ) + l y f + l y f ) ∗ 3 ∗ a ∗ a (qsm(lyf,2)+lyf+lyf)*3*a*a (qsm(lyf,2)+lyf+lyf)3aa
其中 l y f = a ∗ b ∗ b lyf = a*b*b lyf=abb

表示周围的剩下的图形可以看做四个完全相同的由一个正方形和两个三角形构成的图形,那么转化成平面n个环染色问题。而上下两个面的染色是独立的随便染,所以再乘 a 2 a^2 a2

那么以三角形为面的想法想法也是类似,这里不解释了

那么我们发现,还有一种轴线,是以顶点和其相对的顶点连线构成的。
比较容易发现绕着这样的线旋转的画
两边分成了两个部分,显然这两个部分只能形成一种置换,而顶点对有6对
所以

int uu = qsm(a,3)*qsm(b,4)%mod;
   sum=(sum+uu*6%mod)%mod;

大概就是这样了
直接给出所有的代码

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ll long long
#define pb push_back
#define mk make_pair
#define lson ch[x][0]
#define rson ch[x][1]
#define int long long

using namespace std;

inline int read()
{
   int x=0,f=1;char ch=getchar();
   while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
   while (isdigit(ch)) {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
   return x*f;
}

const int mod = 1e9+7;

int qsm(int i,int j)
{
   int ans=1;
   while (j)
   {
   	if (j&1) ans=ans*i%mod;
   	i=i*i%mod;
   	j>>=1;
   }
   return ans;
}

int a,b;

signed main()
{
  freopen("a.in","r",stdin);
  freopen("a.out","w",stdout);
  a=read(),b=read();
  int sum=0;
  int ymh = a*b%mod;
  int lyf = a*b%mod*b%mod;
  sum=(sum+qsm(a,6)*qsm(b,8)%mod)%mod;
  //cout<
  sum=(sum+(qsm(lyf,2)+lyf+lyf)%mod*3%mod*a%mod*a%mod)%mod;
  sum=(sum+(ymh*ymh%mod+ymh*ymh%mod)%mod*b%mod*b%mod*4%mod)%mod;
  int uu = qsm(a,3)*qsm(b,4)%mod;
  sum=(sum+uu*6%mod)%mod;
  cout<<sum*qsm(24,mod-2)%mod<<endl;
  return 0;
}

你可能感兴趣的:(polya,burnside,c++)