HDU 3547 DIY Cube 数论- Polya定理

题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=3547


给定正方体,要求给正方形的八个顶点着色,问有多少种不同的着色方案,当然通过旋转和翻转得到的着色方案视为相同。

这题是一道典型的Polya定理的题目,根据polya定理,可以直接求得公式。

①单位元素(1)(2)(3)(4)(5)(6)(7)(8),格式为(1)^8。
②绕过xx'轴旋转±90°的置换分别为(1 2 3 4)(5 6 7 8), (4 3 2 1)(8 7 6 5) ,格式为(4)^2,同类的置换有6个。
③绕xx'轴旋转180°的置换为(1 3)(2 4)(5 7)(6 8),格式(2)^4,同类的置换有3个。

④绕yy'轴旋转180 °的置换为(1 7)(2 6)( 3 5 )(4 8)格式为(2)^4,同类的置换有6个。

⑤绕zz'轴旋转±120°的置换分别为(8 3 6)(4 2 5) (1)(7)          (6 3 8)(5 2 4) (1)(7)格式为(3)^2 (1)^2,同类的置换有8个

从而对于给定的输入N,得到的答案是(n^8+17*n^4+6*n^2)/24.

因为数据比较大,用java写。


代码如下:

import java.io.*;
import java.util.Scanner;
import java.math.BigInteger;
public class Main
{
    public static void main(String[] args)
    {
        Scanner cin=new Scanner(System.in);
        BigInteger sum,n,m,a=BigInteger.ONE,b=BigInteger.ONE,c=BigInteger.ONE;
        int cas;
        BigInteger q=new BigInteger("17");
        BigInteger p=new BigInteger("6");
        BigInteger r=new BigInteger("24");
        BigInteger mm=new BigInteger("1000000000000000");
        cas=cin.nextInt();
        int i;
        String aa,bb;
        for(i=1;i<=cas;i++)
        {
            n=cin.nextBigInteger();
            int j;
            a=BigInteger.ONE;b=BigInteger.ONE;c=BigInteger.ONE;
            for(j=1;j<=8;j++)
               b=b.multiply(n);
            a=a.multiply(n);
            a=a.multiply(n);
            a=a.multiply(p);
            c=c.multiply(n);
            c=c.multiply(n);
            c=c.multiply(n);
            c=c.multiply(n);
            c=c.multiply(q);
            a=a.add(b);
            a=a.add(c);
            a=a.divide(r);
            aa=a.toString();
            bb=mm.toString();
            int len=aa.length();
            if(aa.length()<=15)
            {
               System.out.println("Case "+i+": "+aa);
            }
            else
            {
               System.out.print("Case "+i+": ");
               for(j=len-15;j<len;j++)
               {
                    System.out.print(aa.charAt(j));
               }
               System.out.println();
            }
        }
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值