题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1812
标准的polya定理问题。
旋转只有 0,90,180,270度三种旋法。
旋0度,则置换的轮换数为n*n
旋90度,n为偶数时,则置换的轮换数为n*n/4,n为奇数,则置换的轮换数为(n*n-1)/4+1
旋180度,n为偶数时,则置换的轮换数为n*n/2,n为奇数,则置换的轮换数为(n*n-1)/2+1
旋270度,n为偶数时,则置换的轮换数为n*n/4,n为奇数,则置换的轮换数为(n*n-1)/4+1
反射 沿对角反射两种,沿对边中点连线反射两种
n为偶数时,沿对边中点连线反射两种的置换轮换数为 n*n/2
沿对角反射两种的置换轮换数为 (n*n-n)/2+n
n为奇数时,沿对边中点连线反射两种的置换轮换数为 (n*n-n)/2+n
沿对角反射两种的置换轮换数为 (n*n-n)/2+n
AC代码:
import java.math.BigInteger;
import java.util.Scanner;
public class Main
{
static Scanner cin=new Scanner(System.in);
public static void main(String[] args)
{
int n,t;
BigInteger c,sum,x,two=BigInteger.valueOf(2),four,eight;
four=BigInteger.valueOf(4);
eight=BigInteger.valueOf(8);
while(cin.hasNext())
{
n=cin.nextInt();
c=cin.nextBigInteger();
sum=BigInteger.ZERO;
if(n%2==0)//偶数
{
x=c.pow(n*n);
sum=sum.add(x);
x=two.multiply(c.pow(n*n/4));
sum=sum.add(x);
x=c.pow(n*n/2);
sum=sum.add(x);
x=two.multiply(c.pow((n*n-n)/2+n));
sum=sum.add(x);
x=two.multiply(c.pow(n*n/2));
sum=sum.add(x);
sum=sum.divide(eight);
}
else
{
x=c.pow(n*n);
sum=sum.add(x);
x=two.multiply(c.pow((n*n-1)/4+1));
sum=sum.add(x);
x=c.pow((n*n-1)/2+1);
sum=sum.add(x);
x=four.multiply(c.pow((n*n+n)/2));
sum=sum.add(x);
sum=sum.divide(eight);
}
System.out.println(sum);
}
}
}