網址如下:
OpenJudge - 2229:Sumsets
這題不是我想出來的
在這里僅做記錄
代碼如下:
#include<iostream>
using namespace std;const int N = 1000000000;
int dp[1000010];
int n;int main() {cin >> n;dp[0] = 1;dp[1] = 1;for (int i = 2; i <= n; i++) {if (i % 2 == 1) {dp[i] = dp[i - 1];}else {dp[i] = (dp[i / 2] + dp[i - 2]) % N;}}cout << dp[n] << endl;return 0;
}
原理如下:
如果N為奇數,那么其中的構成必定有一個1,把這個1確定下來,剩下的組合就和N - 1的一樣
如果N為偶數,則分兩種情況
一個是組合中有偶數個1,因為至少有兩個1,把這兩個1確定下來,剩下的組合就和N - 2的一樣
另一個是組合中沒有1,那么組合的數量就和N / 2的一樣,相當于你將N = (一堆組合加起來)。兩邊同除2,就可以看出來