套用polya计算出奇偶,旋转,反射16种情况的方案数。。
import java.util.*;
import java.io.*;
import java.math.*;
import java.lang.*;
public class Main
{
public static void main(String args[])
{
Scanner cin = new Scanner(System.in);
int a, b;
while(cin.hasNext()) {
a = cin.nextInt();
b = cin.nextInt();
BigInteger ans = BigInteger.ZERO;
BigInteger tt = BigInteger.valueOf(b);
if(a % 2 == 0) {
BigInteger t = BigInteger.ONE;
for(int i = 1; i <= a * a; i++) t = t.multiply(tt);
ans = ans.add(t);
t = BigInteger.ONE;
for(int i = 1; i <= (a * a) / 4; i++) t = t.multiply(tt);
ans = ans.add(t);
t = BigInteger.ONE;
for(int i = 1; i <= (a * a) / 2; i++) t = t.multiply(tt);
ans = ans.add(t);
t = BigInteger.ONE;
for(int i = 1; i <= (a * a) / 4; i++) t = t.multiply(tt);
ans = ans.add(t);
t = BigInteger.ONE;
for(int i = 1; i <= (a * a) / 2; i++) t = t.multiply(tt);
ans = ans.add(t);
t = BigInteger.ONE;
for(int i = 1; i <= (a * a) / 2; i++) t = t.multiply(tt);
ans = ans.add(t);
t = BigInteger.ONE;
for(int i = 1; i <= (a * a + a) / 2; i++) t = t.multiply(tt);
ans = ans.add(t);
t = BigInteger.ONE;
for(int i = 1; i <= (a * a + a) / 2; i++) t = t.multiply(tt);
ans = ans.add(t);
}
else {
BigInteger t = BigInteger.ONE;
for(int i = 1; i <= a * a; i++) t = t.multiply(tt);
ans = ans.add(t);
t = BigInteger.ONE;
for(int i = 1; i <= (a * a + 3) / 4; i++) t = t.multiply(tt);
ans = ans.add(t);
t = BigInteger.ONE;
for(int i = 1; i <= (a * a + 1) / 2; i++) t = t.multiply(tt);
ans = ans.add(t);
t = BigInteger.ONE;
for(int i = 1; i <= (a * a + 3) / 4; i++) t = t.multiply(tt);
ans = ans.add(t);
t = BigInteger.ONE;
for(int i = 1; i <= (a * a + a) / 2; i++) t = t.multiply(tt);
ans = ans.add(t);
t = BigInteger.ONE;
for(int i = 1; i <= (a * a + a) / 2; i++) t = t.multiply(tt);
ans = ans.add(t);
t = BigInteger.ONE;
for(int i = 1; i <= (a * a + a) / 2; i++) t = t.multiply(tt);
ans = ans.add(t);
t = BigInteger.ONE;
for(int i = 1; i <= (a * a + a) / 2; i++) t = t.multiply(tt);
ans = ans.add(t);
}
ans = ans.divide(BigInteger.valueOf(8));
System.out.println(ans.toString());
}
}
}