- No Nine
No Nine
给定一个区间[x1, x2],确定区间内有多少个不包含9且不被9整除的数,由于两个端点都是非9数,就是求[0, x1], [0, x2]的差+1。
如果只找不包含9的数。其实就是找如果把九进制数当作十进制来看的话,落在这个区间内的九进制数有多少个0-8,10-18,……
从十位(第1位)数开始往后,每位下面都包含完整9^i个数
算出来有多少个不包含9的数之后,就要去掉9的倍数,最后正好每组9个数中有1个是9的倍数
例如12345,剔除包含9的数之后剩下9个一组的00000-00008,00010-00018,……,12330-12338。每一组必定只有一个9的倍数,所以*8/9
最后再加上12340-12345中不是9的倍数的数就行。
C++ Code
1 | #include <iostream> |
Sherlock and the Bit Strings
给定一个01字符串的长度以及一些限制(a, b, c),保证[a, b]区间内的1的个数恰好为c,同时返回满足条件的第p个字典序解。
用动态规划,dp[i][j]代表前i个bit确定并且前i个中最后15个bit(题目中说b-a不超过15)与j的二进制表示相同时解的个数。用一个limits数组记录每个位置为右端点b的时候限制的区间长度(b-a+1)和限制数c。每次检查的时候都将送进来的j的后b-a+1位与1然后计算个数。
初始化:dp[n][j] = 1 if 不违背限制 else 0
递推:dp[i][j] = dp[i+1][(j<<1)&((1<<16) - 1)] + dp[i+1][(j<<1))&((1<<16) - 1) + 1] if j不违背限制 else 0
1 |
|