数棋盘
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
3
-
描述
-
一个有N×N个格子的正方形棋盘,每个格子可以用C种不同颜色来染色,一共可以得到多少种不同的棋盘。如果一个棋盘,经过任意旋转,反射后变成另一个棋盘,这两个棋盘就是属于同一种棋盘。
比如当N=C=2的时候,有下面六种不同的棋盘:
现在告诉你N和C,请你算算,到底有多少种不同的棋盘.
-
输入
-
本题目包含多组测试,请处理到文件结束。
每组测试数据包含两个正整数N和C(0<N,C,<31),分别表示棋盘的大小是N×N,用C种颜色来进行染色。
输出
- 对于每组测试,在一行里输出答案。 样例输入
-
2 2 3 1
样例输出
-
6
1
-
思路:polya定理, 运用到线性代数的知识点。
-
旋转只有 0,90,180,270度三种旋法。
旋0度,则置换的轮换数为n*n
旋90度,n为偶数时,则置换的轮换数为n*n/4,n为奇数,则置换的轮换数为(n*n1)/4+1
旋180度,n为偶数时,则置换的轮换数为n*n/2,n为奇数,则置换的轮换数为(n*n1)/2+1
旋270度,n为偶数时,则置换的轮换数为n*n/4,n为奇数,则置换的轮换数为(n*n1)/4+1
反射 沿对角反射两种,沿对边中点连线反射两种
n为偶数时,沿对边中点连线反射两种的置换轮换数为 n*n/2
沿对角反射两种的置换轮换数为 (n*n-n)/2+n
n为奇数时,沿对边中点连线反射两种的置换轮换数为 (n*n-n)/2+n
沿对角反射两种的置换轮换数为 (n*n-n)/2+n -
import java.math.BigInteger; import java.util.Scanner; public class Main { public static void main(String[] args) { int n; Scanner sc = new Scanner(System.in); BigInteger two = new BigInteger("2"); BigInteger three = new BigInteger("3"); BigInteger four = new BigInteger("4"); BigInteger eight = new BigInteger("8"); BigInteger sum, m; while(sc.hasNext()){ //偶数时 n = sc.nextInt(); m = sc.nextBigInteger(); sum = BigInteger.ZERO; if(n % 2 == 0){ sum = sum.add(m.pow(n*n)); sum = sum.add(two.multiply(m.pow(n*n/4))); sum = sum.add(three.multiply(m.pow(n*n/2))); sum = sum.add(two.multiply(m.pow((n*n+n)/2))); sum = sum.divide(eight); } else{ //奇数时 sum = sum.add(m.pow(n*n)); sum = sum.add(two.multiply(m.pow((n*n+3)/4))); sum = sum.add(m.pow((n*n+1)/2)); sum = sum.add(four.multiply(m.pow((n*n+n)/2))); sum = sum.divide(eight); } System.out.println(sum); } } }
-
本题目包含多组测试,请处理到文件结束。