题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1032
题目大意:一个十进制数变化为二进制,那么对于这个数,如果连着两个二进制位都为1,那么称为一个相邻的点, 一个数可能有多个相邻的点。现在给你一个数n, 问从1到n中有多少相邻的点。
解题思路:由于n的范围,所以不能用循环做。对于输入的数n可以通过n,直接求得答案。
假设n的二进制数为111100101111000, 对于中间的两个数111100101111000, 对于中间那两个位置是11有多少种可能? 那不就是前面数字(1111001)2乘以后面全部的排列数!根据这个思路
代码如下:
#include<bits/stdc++.h> using namespace std; void solve(int cases) { long long n; scanf("%lld",&n); long long ans = 0; long long res = 1, a = 1; while((n >> 1) != 0) { if((n & 1) && ((n >> 1) & 1)) ans += (n >> 2)*a + res; else { if((n >> 2) != 0) ans += (n >> 2)*a; } if(n & 1) res += a; a = a*2; n >>= 1; } printf("Case %d: %lld ", cases, ans); } int main() { int t; scanf("%d", &t); for(int i=1; i<=t; ++ i) solve(i); return 0; }