• 51Nod 1048 1383 整数分解为2的幂


    任何正整数都能分解成2的幂,给定整数N,求N的此类划分方法的数量!
    比如N = 7时,共有6种划分方法。
     
    7=1+1+1+1+1+1+1
      =1+1+1+1+1+2
      =1+1+1+2+2
      =1+2+2+2
      =1+1+1+4
      =1+2+4
     
    傻逼的高精度DP,我只选Java BigInteger。
     
     1 import java.util.*;
     2 import java.math.*;
     3 
     4 public class Main {
     5     public static void main(String[] args) {
     6         Scanner in = new Scanner(System.in);
     7         
     8         BigInteger N = in.nextBigInteger();
     9         
    10         BigInteger F[][] = new BigInteger[125][125];
    11         BigInteger G[][] = new BigInteger[125][125];
    12         
    13         for (int i = 0; i <= 120; ++i)
    14             for (int j = 0; j <= 120; ++j) {
    15                 F[i][j] = BigInteger.ZERO;
    16                 G[i][j] = BigInteger.ZERO;
    17             }
    18         
    19         F[0][0] = BigInteger.ONE;
    20         
    21         for (int i = 1; i <= 120; ++i) {
    22             F[i][i] = BigInteger.ONE;
    23             
    24             for (int j = 0; j < i; ++j)
    25                 for (int k = 0; k <= j; ++k)
    26                     F[i][j] = F[i][j].add(F[i - 1][k].multiply(F[i - k - 1][j - k]));
    27         }
    28         
    29         int tot = 0;
    30         
    31         BigInteger TWO = BigInteger.ONE.add(BigInteger.ONE);
    32         
    33         for (int i = 0; i <= 120; ++i) {
    34             if (N.mod(TWO).toString().charAt(0) == '1') {
    35                 if (++tot == 1) {
    36                     for (int j = 0; j <= i; ++j)
    37                         G[tot][j] = F[i][j];
    38                 }
    39                 else {
    40                     for (int j = 0; j <= i; ++j)
    41                         for (int k = 0; k <= j; ++k)
    42                             G[tot][j] = G[tot][j].add(G[tot - 1][k].multiply(F[i - k][j - k]));
    43                 }
    44             }
    45             
    46             N = N.divide(TWO);
    47         }
    48         
    49         BigInteger ANS = BigInteger.ZERO;
    50         
    51         for (int i = 0; i <= 120; ++i)
    52             ANS = ANS.add(G[tot][i]);
    53         
    54         System.out.println(ANS.toString());
    55     }
    56 }

    @Author: YouSiki

  • 相关阅读:
    [NOI2005]维修数列
    [USACO07OPEN]吃饭Dining
    [TJOI2010]打扫房间
    [SCOI2005]最大子矩阵
    [HNOI2007]最小矩形覆盖
    [HAOI2006]受欢迎的牛
    BZOJ2087[Poi2010] Sheep
    [USACO08DEC]在农场万圣节Trick or Treat on the Farm
    [POI2013]BAJ-Bytecomputer
    HGOI20190126 模拟赛
  • 原文地址:https://www.cnblogs.com/yousiki/p/6637859.html
Copyright © 2020-2023  润新知