明天就要去實驗室幹活了。。。。下次再打題不知是何時。。。。
這題不難,一開始想錯了。。。。其實並不複雜,從低位到高位,逐個1處理。
我用了個簡單dp。
先將n轉化成二進位制。
我們劃分出每個1+x個0的情況(x可為0)。
對於單個模組假設有s0[i+1]種情況,在前乙個模組退乙個1的情況下有s1[i+1]中情況。(這是有規律的)
假設不進製的情況下情況數:dp[0][i]
進製的情況下情況數:dp[1][i]
這樣得到轉移方程:dp[0][i+1] = s0[i+1]*dp[0][i] + dp[1][i]
dp[1][i+1] = s1[i+1]*dp[0][i] + dp[1][i]
ac**:
1 #include 2view code3using
namespace
std;
4const
int maxn = 50;5
6int
p[maxn];
7 typedef long
long
int64;
89 int64 dp[2
][maxn];
1011
int main(void
)else
2324 vectorv;
25int t = 1;26
for(int i = 0; i < cnt; ++i)else33}
34//
cout << "haha" << endl;
3536
int sz =v.size();
37int64 ans;
38 dp[0][0] = v[0], dp[1][0] = v[0]-1;39
for(int i = 1; i < sz; ++i)
43/*
for(int i = 0; i < sz; ++i)
44cout << dp[0][i] << " " << dp[1][i] << endl;
*/45 ans = dp[0][sz-1
];46
47 printf("
%lld\n
", ans);48}
4950
return0;
51 }
擴充套件二進位制數
1.題目描述 傳送門2.code c 版本 include using namespace std int dp 64 3 2 int num 64 int n int dfs int i,int j,int k if dp i j k 0 else if 2 k num i 1 1 1 2 k n...
二進位制分組擴充套件
最近才發現的乙個套路,以前以為二進位制分組只能搞揹包,結果發現還有一些更為優秀的操作。我們對於乙個不支援動態操作的資料結構,拆分為 log 個,然後每次加入元素加入到乙個新的組中,如果最新的兩個資料結構元素個數相等,就合併兩個元素。然後暴力重構這個合併得到的資料結構。然後查詢的時候就查詢每乙個分組內...
二進位制 二進位制起源
現代通訊技術的基礎是二進位制編碼。早在1865年麥克斯韋總結出麥克斯韋方程組之前,美國人摩斯 morse 於1837年發明了摩斯電碼和有線電報。有線電報的出現,具有劃時代的意義 它讓人類獲得了一種全新的資訊傳遞方式,這種方式 看不見 摸不著 聽不到 完全不同於以往的信件 旗語 號角 烽火,這也是二進...