UVa 11645 Bits (violence + combinatorics)

The meaning of the question: Given a number n, find 0 ~ n, the number of times that two consecutive 1s appear in the binary representation.

Analysis: enumerate two consecutive 1s, enumerate from low to high, and then the front can be any number, and the latter can also be arbitrary. If n happens to be 11, it will be calculated separately, for example.

10110, assuming that the 2nd and 3rd digits are enumerated now, then the number of occurrences is the previous 10, and the first digit is arbitrary, so there are 10 = 2 * 2 = 4 kinds, and exactly the 2nd digit And the 3rd bit is 1, then for the 1st bit is also random, plus 2.

code show as below:

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <cstdio>
#include <string>
#include <cstdlib>
#include <cmath>
#include <iostream>
#include <cstring>
#include <set>
#include <queue>
#include <algorithm>
#include <vector>
#include <map>
#include <cctype>
#include <cmath>
#include <stack>
#include <sstream>
#include <list>
#include <assert.h>
#include <bitset>
#include <numeric>
#define debug() puts("++++")
#define gcd(a, b) __gcd(a, b)
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define fi first
#define se second
#define pb push_back
#define sqr(x) ((x)*(x))
#define ms(a,b) memset(a, b, sizeof a)
#define sz size()
#define be begin()
#define ed end()
#define pu push_up
#define pd push_down
#define cl clear()
#define lowbit(x) -x&x
//#define all 1,n,1
#define FOR(i,n,x)  for(int i = (x); i < (n); ++i)
#define freopenr freopen("in.in", "r", stdin)
#define freopenw freopen("out.out", "w", stdout)
using namespace std;

typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> P;
const int INF = 0x3f3f3f3f;
const LL LNF = 1e17;
const double inf = 1e20;
const double PI = acos(-1.0);
const double eps = 1e-8;
const int maxn = 1500 + 50;
const int maxm = 1e6 + 10;
const LL mod = 1000000000000000LL;
const int dr[] = {-1, 1, 0, 0, 1, 1, -1, -1};
const int dc[] = {0, 0, 1, -1, 1, -1, 1, -1};
const char *de[] = {"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"};
int n, m;
const int my[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
const int monn[] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
inline bool is_in(int r, int c) {
  return r >= 0 && r < n && c >= 0 && c < m;
}
inline int readInt(){ int x;  scanf("%d", &x);  return x; }

LL p, q;
void add(LL x){
  q += x;
  p += q / mod;
  q %= mod;
}

int main(){
  int case = 0;
  LL n;
  while(cin >> n && n >= 0){
    p = q = 0;
    LL m = 1LL, t = n;
    while(n){
      add((n>>2) * m);
      if((n&3) == 3)  add((t&m-1) + 1);
      n >>= 1;
      m <<= 1;
    }
    printf("Case %d: ", ++kase);
    if(p)  printf("%lld%015lld\n", p, q);
    else  printf("%lld\n", q);
  }
  return 0;
}

  

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=325023488&siteId=291194637