|
亲!马上注册或者登录会查看更多内容!
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
问题可以转化为统计1~N这N个数中,每一个位上一共出现了多少次1,对于一个数x,其每一位上出现1的个数用f(x)表示,如果其为1的最高bit是n,则有f(x) = f((1<<n)-1) + f((x^(1<<n))+1),其中+表示统计结果的对应项相加
- #include <vector>
- using std::vector;
- class Solution {
- public:
- typedef long long LL;
- static const int MAX = 60;
- static const LL ONE = 1;
- void count(vector<LL>& c, LL x){
- if(!x) return;
-
- int n = 0;
- for(int i = 0; i < MAX; ++i){
- if(x & (ONE << i)) n = i;
- }
- LL y = x ^ (ONE << n);
- c[n] += y + 1;
- for(int i = 0; i < n; ++i){
- c【i】 += ONE << (n-1);
- }
- count(c, y);
- }
- long long xorSum(long long x) {
- vector<LL> c(MAX, 0);
- count(c, x);
- LL res = 0;
- for(int i = 0; i < MAX; ++i){
- if(c【i】 & 1) res |= ONE << i;
- }
- return res;
- }
- };
复制代码
|
评分
-
查看全部评分
|