HDU 4633 Who's Aunt Zhang (Polya定理之轴不动的处理方式)

  题目:HDU 4633 Who's Aunt Zhang

  题目大意:这个题目的意思就是给一个正六面体的8个顶点,12条棱以及每个面分成9个小面,一共54个小面。对这些元素进行染色,染料无使用限制。

  那么,为什么要写这个题目呢,首先,这个题目让我回忆起了之前我作为模板打的一道题里面也涉及到了轴上元素不动的情况,当时因为不懂,也没见过一样的情况,就没怎么在意,今天看到了就不能再放任不懂了。而后就是这个题目我看到的题解只是写下了代码,并未告诉我们处理方式,所以经过思考我得出了结论,记录下来也是我写这个题目的原因。

  解题思路:看起来是一个裸的Polya定理,但是有不动元素的干扰,简单讲讲怎么处理就是:不动的元素个数设为x,先从原来要找的循环节中拿出来,然后剩下的按照正六面体找循环节的方式寻找,之后加不动元素的循环节的个数就是总循环节的个数。为什么这样呢,这就很好解释了,比如1变化到1,那么他自己就占了一个循环节呗,但是之前没思考过。当然,这个题目也验证了我之前写下的找正六面体循环节的方法的正确性(因为和书上的还有dalao的都不一样,我把他们写的我认为正确的部分整合了而已,今天得以验证。)。具体方式见代码注释。

  ac代码:

#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<algorithm>
#define mod 10007
using namespace std;
long long qpow(long long a,long long b){
    long long ans=1;
    while (b){
        if (b&1)ans=(ans*a)%mod;
        a=(a*a)%mod;
        b>>=1;
    }
    return (ans+mod)%mod;
}
int main(){
    long long i,j,t,k,cas=0;
    scanf("%lld",&t);
    while (t--){
        scanf("%lld",&k);
        long long ans=0;
        ans=(ans+qpow(k,74))%mod//全都不动的情况,一共74个循环节;
        ans=(ans+3*(2*qpow(k,20)+qpow(k,38)))%mod;//以上下底面中心为轴旋转90°270°以及180°对应的都是上下底面中心的那个小面不变,90°270°循环节个数=8/4+12/4+(54-2)/4--循环节为4,所以除以4+2--这两个是不动的,同理180°的循环节个数=8/2+12/2+(54-2)/2+2。
        ans=(ans+6*qpow(k,38))%mod;//以对棱中心为旋转轴,循环节为2,不动的为两条边,循环节个数=8/2+(12-2)/2+54/2+2。
        ans=(ans+8*qpow(k,26))%mod;//以对顶点为转轴,循环节为3,不动的为两个定点,循环节个数=(8-2)/3+12/3+54/3+2。
        ans=(ans*qpow(24,mod-2)+mod)%mod;//这个是置换总数的逆元
        printf("Case %lld: %lld\n",++cas,ans);
    }
}

  之前那个题目看懂了之后我会把解释再发一遍,那个双重循环看起来比这个难得多......

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值