免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
LuoguP6218 [USACO06NOV] Round Numbers S

題目描述

如果一個(gè)正整數(shù)的二進(jìn)制表示中,00的數(shù)目不小于11的數(shù)目,那么它就被稱(chēng)為「圓數(shù)」。

例如,99的二進(jìn)制表示為10011001,其中有22個(gè)00與22個(gè)11。因此,99是一個(gè)「圓數(shù)」。

請(qǐng)你計(jì)算,區(qū)間[l,r][l,r]中有多少個(gè)「圓數(shù)」。

輸入格式

一行,兩個(gè)整數(shù)ll和rr。

輸出格式

一行,一個(gè)整數(shù),表示區(qū)間[l,r][l,r]中「圓數(shù)」的個(gè)數(shù)。

樣例

輸入:2 122 12         輸出: 66

思路

顯然這道題又是一道數(shù)位DP。但是這個(gè)題的難點(diǎn)和特殊之處就在于它是在二進(jìn)制下處理的。這就需要我們重新揣度此題的狀態(tài)。

設(shè)f[i][j][k]f[i][j][k]表示一個(gè)有ii位,且其中包括jj個(gè)11,且從右往左數(shù)第ii個(gè)數(shù)是kk的圓數(shù)的個(gè)數(shù)。這個(gè)如何轉(zhuǎn)移呢?

顯然的是,若j<ij<i,  f[i][j][0]=f[i?1][j][0]+f[i?1][j][1]f[i][j][0]=f[i?1][j][0]+f[i?1][j][1],若j!=0j!=0, 則f[i][j][1]=f[i?1][j?1][0]+f[i?1][j?1][1]f[i][j][1]=f[i?1][j?1][0]+f[i?1][j?1][1] (這個(gè)感性理解一下?)

最后就分成兩種情況處理:

1.將位數(shù)小于cnt位的圓數(shù)累加到答案中

2.和其他數(shù)位DP類(lèi)似,考慮用添數(shù)的方法解決問(wèn)題。若當(dāng)前遍歷到該位為11,那么就存在該位為00的情況,這時(shí)候再枚舉11的位數(shù),考慮還是否能構(gòu)成圓數(shù),若能構(gòu)成,累加答案即可。

最后前綴和統(tǒng)計(jì)答案即可。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<cstring>
  5. typedef long long ll;
  6. int l, r;
  7. ll f[35][35][2];
  8. inline int read(void){
  9. int f = 1, x = 0;char ch;
  10. do{ch = getchar();if(ch=='-')f = -1;} while (ch < '0' || ch > '9');
  11. do{ x = x * 10 + ch - '0';ch = getchar();} while (ch >= '0' && ch <= '9');
  12. return f * x;
  13. }
  14. inline void _init(void){
  15. f[1][0][0] = 1, f[1][1][1] = 1;//初始化
  16. for (int i = 2; i <= 32;++i){
  17. for (int j = 0; j <= i;++j){
  18. if(j<i) f[i][j][0] = f[i - 1][j][0] + f[i - 1][j][1];//若既有0又有1或只有0
  19. if(j) f[i][j][1] = f[i - 1][j - 1][0] + f[i - 1][j - 1][1];//若有1或全部是1
  20. }
  21. }
  22. return;
  23. }
  24. inline ll calc(int x){
  25. int bn[35], cnt = 0;
  26. ll res = 0;
  27. if(x==0) return 1;
  28. while(x){
  29. bn[++cnt] = x & 1;
  30. x >>= 1;
  31. }//二進(jìn)制拆分
  32. for (int i = 1; i < cnt;++i){
  33. for (int j = 0; j <= (i >> 1); ++j)
  34. res += f[i][j][1];
  35. }//統(tǒng)計(jì)小于cnt位的圓數(shù),(i>>1)這個(gè)就是保證了所得的數(shù)一定為圓數(shù)
  36. int s0 = 0, s1 = 1;//s1一定要賦值為1,因?yàn)闊o(wú)論如何我們討論的數(shù)都是大于1的(為0的情況在開(kāi)頭就舍掉了)
  37. for (int i = cnt - 1; i >= 1;--i){
  38. if(bn[i]) for (int j = 0; j <= i;++j){
  39. if(s0+i-j>=s1+j) res += f[i][j][0];//已確定的0的個(gè)數(shù)+枚舉的0的個(gè)數(shù)>=已確定的1的個(gè)數(shù)+枚舉的1的個(gè)數(shù)
  40. }// s0 + i - j >= s1 + j
  41. bn[i] ? ++s1 : ++s0;
  42. }
  43. return res;
  44. }
  45. int main(){
  46. l = read(), r = read();
  47. _init();
  48. printf("%lld\n", calc(r + 1) - calc(l));
  49. return 0;
  50. }
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶(hù)發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
[Trie]JZOJ 3231 【佛山市選2013】海明距離
NOIP 2017提高組復(fù)賽解題報(bào)告
2018 藍(lán)橋杯省賽 B 組模擬賽(五)題目及解析
面試官,別問(wèn)我 Bit Operation 了!
class文件內(nèi)容分析總結(jié)
轉(zhuǎn)載統(tǒng)計(jì)數(shù)中二進(jìn)制1的個(gè)數(shù)
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服