国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

nyoj222 整數(shù)中的1 數(shù)位DP

2019-11-10 22:05:32
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

       從a枚舉到b是一定會(huì)超時(shí)的。此題應(yīng)該考慮數(shù)位dp,也可以理解為遞推,假設(shè)給定數(shù)n,就能在O(32)復(fù)雜度算出所有小于等于n的數(shù)中1出現(xiàn)的次數(shù),那么給定區(qū)間[a, b],solve(b) - solve(a - 1)就是答案。

     把n化為二進(jìn)制考慮,假設(shè)當(dāng)前有k位前綴保持不變,且第k+1位為1,前綴中共有 cnt 個(gè)1,除去前k+1位,還剩余x位,那么答案應(yīng)該增加 cnt * (2 ^ x) + h(x) ,h(x)表示這x位數(shù)字1的個(gè)數(shù),注意x位中任意一位要么為0要么為1。一直遞推即可得到答案,但是沒(méi)有考慮n本身的1,所以最后把n的1加上就行了。

AC代碼:

#include<cstdio>#include<iostream>using namespace std;const int maxn = 35;int w[maxn], h[maxn];void deal(){	h[0] = 0;	w[0] = 1;	w[1] = 2;	h[1] = 1;	for(int i = 2; i < 31; ++i) {		w[i] = w[i - 1] * 2;		h[i] = h[i - 1] + w[i - 1] + h[i - 1];	}}int solve(int n){	if(n == -1) return 0;	int cnt = 0;	int m = n;	while(m > 0){		if(m & 1) cnt++;		m >>= 1;	}	int ans = cnt;	for(int i = 1; n > 0; ++i, n >>= 1){		//cout << i << '/n';				if((n & 1) == 0) continue;		cnt--;		ans += cnt * w[i - 1] + h[i - 1];			}	return ans;}int test(int n){  //測(cè)試函數(shù)	int ans = 0;	for(int i = 1; i <= n; ++i){		int w = i;		while(w > 0){			if(w & 1) ++ans;			w >>= 1;		}	}	return ans;}int main(){	deal();	int a, b;	while(scanf("%d%d", &a, &b) == 2){		PRintf("%d/n", solve(b) - solve(a - 1));	}	return 0;}如有不當(dāng)之處歡迎指出!


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 沁水县| 隆子县| 婺源县| 海宁市| 兴隆县| 凤山县| 朝阳区| 木兰县| 平和县| 南漳县| 西峡县| 昭觉县| 贵德县| 女性| 临武县| 西吉县| 临澧县| 湖北省| 天长市| 兰坪| 鄂伦春自治旗| 交城县| 博湖县| 唐山市| 调兵山市| 海盐县| 色达县| 武义县| 石林| 阿瓦提县| 哈巴河县| 虞城县| 望谟县| 财经| 江源县| 宜阳县| 花莲市| 壶关县| 弥渡县| 绵阳市| 宁陵县|