九度 1084整數拆分

/*
對於奇數n=2k+1:它的拆分的第一項一定是1,考慮去掉這個1,其實就一一對應於
2k的拆分,因此f(2k+1)=f(2k).

對於偶數n=2k:考慮有1和沒有1的拆分。有1的拆分,與(2k-1)的拆分一一對應,與上面奇數的情況
理由相同;沒有1的拆分,將每項除以2,正好一一對應於k的所有拆分。因此f(2k)=f(2k-1)+f(k).

需要注意f(n)會很大,不要溢出了。最終結果只要求除以十億的餘數,在int的表示範圍內,
因此不需要大數運算。注意餘數的性質:(a+b)%m == (a%m+b%m)%m,所以只要對每個中間
結果也都取餘數,就不會有溢出的問題,且不改變最終輸出結果。
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
int num[1000010];
int main()
{
    num[0]=num[1]=1;
    for(int i=1;i<=500000;i++){
        num[2*i]=(num[2*i-2]+num[i])%1000000000;
        num[2*i+1]=num[2*i];
    }
    int n;
    while(~scanf("%d",&n)){
        printf("%d\n",num[n]);
    }
    return 0;
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章