zoukankan      html  css  js  c++  java
  • HDU 2709 Sumsets(递推)

    Sumsets

    http://acm.hdu.edu.cn/showproblem.php?pid=2709

    Problem Description
    Farmer John commanded his cows to search for different sets of numbers that sum to a given number. The cows use only numbers that are an integer power of 2. Here are the possible sets of numbers that sum to 7:

    1) 1+1+1+1+1+1+1
    2) 1+1+1+1+1+2
    3) 1+1+1+2+2
    4) 1+1+1+4
    5) 1+2+2+2
    6) 1+2+4

    Help FJ count all possible representations for a given integer N (1 <= N <= 1,000,000).
     
    Input
    A single line with a single integer, N.
     
    Output
    The number of ways to represent N as the indicated sum. Due to the potential huge size of this number, print only last 9 digits (in base 10 representation).
     
    Sample Input
    7
     
    Sample Output
    6
     
    解题代码:
     
    /*
     设way[n]为和为 n 的种类数;
    
    根据题目可知,加数为2的N次方,即 n 为奇数时等于它前一个数 n-1 的种类数 way[n-1] ,若 n 为偶数时分加数中有无 1 讨论,即关键是对 n 为偶数时进行讨论:
    
    1.如果所求的n为奇数,那么所求的分解结果中必含有1,因此,直接将n-1的分拆结果中添加一个1即可 为way[n-1]
    
    2.如果所求的n为偶数,那么n的分解结果分两种情况
    
        (1).如果加数里含1,则一定至少有两个1,即对n-2的每一个加数式后面 +1+1,总类数为way[n-2];
        (2).不含有1 那么,分解因子的都是偶数,将每个分解的因子都除以2,刚好是n/2的分解结果,并且可以与之一一对应,这种情况有 s[n/2]
    
    所以,状态转移方程为:
    
        如果i为奇数  way[n] = way[n-1]
        如果i为偶数  way[n] = way[n-2]+way[n/2];
    */
    #include <stdio.h>
    #include <math.h>
    #include <string.h>
    
    
    #ifdef WINDOWS
        #define LL __int64
        #define LLd "%I64d"
    #else
        #define LL long long
        #define LLD "%lld"
    #endif
    
    const int max_n = 1e6+2;
    const LL MOD = 1e9;
    LL way[max_n];
    
    void deal() 
    {
        way[0] = way[1] = 1;
        for (int i = 2; i < max_n; i ++)
        {
            if (!(i&1))
            {
                way[i] = way[i-2] + way[i/2];
                way[i] %= MOD;
            }
            else 
            {
                way[i] = way[i-1];
                way[i] %= MOD;
            }
        }
    }
    int main ()
    {
        int n;
        deal();
        while (~scanf ("%d", &n))
        {
            printf (LLD"
    ", way[n]);
        }
        return 0;
    }
  • 相关阅读:
    静水流深,沧笙踏歌
    iOS 进阶 第二十二天(0603)
    iOS 进阶 第二十一天(0531)
    iOS 进阶 第二十天(0520)
    iOS 进阶 第十九天(0423)
    iOS 进阶 第十八天(0423)
    iOS 进阶 第十七天(0420)
    iOS 进阶 第十六天(0419)
    iOS 进阶 第十五天(0417)
    iOS 进阶 第十四天(0416)
  • 原文地址:https://www.cnblogs.com/shengshouzhaixing/p/3196299.html
Copyright © 2011-2022 走看看