bzoj3780 數字統計

2022-04-29 23:36:07 字數 2278 閱讀 8785

題意:

將[l..r]中的所有整數用m位二進位制數表示(允許出現前導0)現在將這些數中的每乙個作如下變換:

從這個數的最低兩位開始,如果這兩位都是0,那麼x=1,否則x=0。現在將這兩位刪去,然後將x放在原來最低位的位置上。重複這個變換直到這個數隻剩下一位為止。

例如01001的變換過程:

01001-->0100-->011-->00-->1。

問[l,r]中多少個數變換後值為y(y為0或1),用無前導零的二進位制數輸出

1<=m<=200,1<=資料組數<=50。

這道題的性質很特殊所以可以用一些機智的方法過掉,但懶於觀察性質就可以寫數字dp.

關於數字dp:

一般是要求將數字視為字串並統計資訊,並通常要求計算一段數字區間的資訊的和的問題。

資料範圍常能達到 10^9 或者 10^18。

特點:思想一般比較簡單但是細節較多,不對拍基本上是要完.

數字dp常見的是在十進位制數字串上進行,本題是二進位制串,也可使用相同的思路.

首先區間查詢可以轉化為字首和相減,我們只需要解決[0,l-1]和[0,r]這兩個區間的答案即可.

那麼問題變成有多少小於等於x的數滿足合併的最終結果為0/1

對於等於x的情況我們特判一下,接下來考慮小於x的情況.如果乙個數y小於x那麼必然有一位和x不同,且一定是x的這一位為1,y的這一位為0.而且,y在這個位置後面的數字隨意填寫都可以滿足y例如,x為01101,y的前三位為010,那麼y後面的兩位任意填寫都可以使y那麼我們列舉y從左到右第乙個和x不同的位置在**.這個位置必須滿足x的這一位是1且y的這一位是0.假如後面還有i個位置,那麼這i個數字可以隨意填寫,我們可以預處理出有多少個長度為i的二進位制串合併之後得到的結果為0/1,記為f[i][0]和f[i][1].(預處理的時候需要加一維才能轉移,考慮一下)

對於左側的數字,y和x是一樣的,我們可以預處理出x的左邊i位在右邊加上乙個0/1之後合併得到的結果,然後就可以dp了.寫起來會有一些細節,一定要對拍.

#include#include

#include

using

namespace

std;

const

int maxn=205

;struct

ll ll(

intx)

}ll

operator +(const ll &b)const

}return

c; }

ll operator -(const ll &b)const

}while(c.num[c.len]==0&&c.len>=1)c.len--;

return

c; }

void

output()

for(int i=len;i>=1;--i)printf("%d"

,num[i]);

}void

operator +=(const ll &b)

}ans;

intm,ans;

char

str1[maxn],str2[maxn];

int g[maxn][2];ll f[maxn][2][2

];inline

int calc(const

int &a,const

int &b)

ll dp(

char

s) memset(f,

0,sizeof

(f));

f[1][0][0]=f[1][1][1]=ll(1

);

for(int i=1;ii)

//f[2][0][0].output();printf("\n");f[2][1][0].output();printf("\n");

ll ans=0

;

for(int i=0;ii)

if(s[i]=='

1'&&g[i][0]==ans)

}else

if(s[i]=='1'

)

if(g[i][calc(0,1)]==ans)}}

return

ans;

}bool check(char

s)int

main()

//while(1);

//fclose(stdin);fclose(stdout);

return0;

}

bzoj 3780 數字統計 (數字dp)

time limit 10 sec memory limit 128 mb submit 50 solved 27 submit status discuss 小a正在研究一些數字統計問題。有一天他突然看到了乙個這樣的問題 將 l.r 中的所有整數用m位二進位制數表示 允許出現前導0 現在將這些數中...

BZOJ 3209 花神的數論題 數字統計

設 f x 為 x 的二進位制表示中 1 的個數。給定 n 求 f i 1 i n 總體思路是列舉每乙個 t 算出 f x t 的 x 有 y 個,然後將 t y 算入答案中。主要的過程是求 y 也就是 中的 solve t 詳見 吧,我只能看別人的題解,自己想不出來qaq 注意 wa警告!wa警告...

數字DP 數字統計

題目 給定兩個正整數a和b,求在 a,b 中的所有整數中,每個數碼 digit 各出現了多少次。數字dp 1 分情況,逐位討論。2 模型 計算在 l,r 中有多少個數滿足條件。3 套路 將問題轉化為 1,r 1,l 1 只需回答 1,x 的詢問即可。思路1.算出 1,x 1 按位拆分,為後面做鋪墊 ...