HDU 3547 DIY Cube 数论- Polya定理
给定正方体,要求给正方形的八个顶点着色,问有多少种不同的着色方案,当然通过旋转和翻转得到的着色方案视为相同。
这题是一道典型的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(); } } } }
补充:软件开发 , C++ ,