hdu 2709 Sumsets

来源:互联网 发布:linux进程管理 编辑:程序博客网 时间:2024/05/21 21:47
如果所求的n为奇数,那么所求的分解结果中必含有1,因此,直接将n-1的分拆结果中添加一个1即可 为s[n-1]如果所求的n为偶数,那么n的分解结果分两种情况1.含有1 这种情况可以直接在n-1的分解结果中添加一个1即可 s[n-1]2.不含有1 那么,分解因子的都是偶数,将每个分解的因子都除以2,刚好是n/2的分解结果,并且可以与之一一对应,这种情况有 s[n/2]所以,状态转移方程为如果i为奇数, s[i] = s[i-1]如果i为偶数  s[i] = s[i-1] + s[i/2]
#include <iostream>#include <algorithm>#include <cstdio>#include <cstring>using namespace std;#define N 1110000int a[N] = {0, 1, 2};int main (){    for (int i=3; i<N; i++)    {        if (i & 1)            a[i] = a[i-1] % 1000000000;        else            a[i] = (a[i-1] + a[i/2]) % 1000000000;    }    int n;    while (cin >> n)        cout << a[n] << endl;    return 0;}


0 0
原创粉丝点击