HDU 3547 DIY Cube

HDU_3547

    这个题目是《组合数学》上面的一个例题。

    一开始我想的是任意一种旋转操作都可以是看成以沿穿过对面的中轴线的3种旋转操作组合而成的,只和操作的数量有关,而和操作的顺序无关,但后来很快发现了反例,于是如果再顺着这个思路考虑操作的顺序话,运算就相当庞大了。

    于是还是不得不只从单一方向的旋转考虑。实际上旋转按旋转轴分类是有4种的:

    ①原地不动。

    ②绕穿过对面的中轴线旋转。

    ③绕穿过对棱的中轴线旋转。

    ④绕正方体对角线旋转。

    这4种情况一共包含了24种旋转操作,都考虑全面之后再应用大数运算就可以了。

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 t = cin.nextInt();
for(int tt = 0; tt < t; tt ++)
{
BigInteger n = cin.nextBigInteger();
System.out.print("Case " + (tt + 1) + ": ");
solve(n);
}
}
static void solve (BigInteger n)
{
BigInteger ans = new BigInteger("0");
ans = ans.add(n.pow(8));
ans = ans.add(n.pow(2).add(n.pow(4)).add(n.pow(2)).multiply(BigInteger.valueOf(3)));
ans = ans.add(n.pow(4).multiply(BigInteger.valueOf(6)));
ans = ans.add(n.pow(4).add(n.pow(4)).multiply(BigInteger.valueOf(4)));
ans = ans.divide(BigInteger.valueOf(24));
if(ans.compareTo(new BigInteger("1000000000000000")) >= 0)
{
ans = ans.mod(new BigInteger("1000000000000000"));
int k = 15 - ans.toString().length();
for(int i = 0; i < k; i ++)
System.out.print("0");
}
System.out.println(ans);
}
}


原文地址:https://www.cnblogs.com/staginner/p/2386012.html