zoukankan      html  css  js  c++  java
  • 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);
    }
    }


  • 相关阅读:
    BZOJ1233 干草堆
    POJ1321棋盘问题【搜索】
    1008
    10.2训练赛
    2014 ACM/ICPC Asia Regional Shanghai Online【未完成】
    hdu5045||2014 ACM/ICPC Asia Regional Shanghai Online【数位dp】
    0926
    poj1007【求逆序数】
    hlg1287数字去重和排序II【hash】
    hlgChocolate Auction【并查集】
  • 原文地址:https://www.cnblogs.com/staginner/p/2386012.html
Copyright © 2011-2022 走看看