http://oj.acm.zstu.edu.cn/JudgeOnline/problem.php?id=4233
题解:题目和解答完全不一样,答案是101010101010101010......的字符串
题意是和二进制位有关的字符串排列。
某一位的状态和这一位的序号-1的二进制中1个数的奇偶有关
C++版本一
AC版本
/*
*@Author: STZG
*@Language: C++
*/
#include <bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<string>
#include<vector>
#include<bitset>
#include<queue>
#include<deque>
#include<stack>
#include<cmath>
#include<list>
#include<map>
#include<set>
//#define DEBUG
#define RI register int
using namespace std;
typedef long long ll;
//typedef __int128 lll;
const int N=100000+10;
const int MOD=1e9+7;
const double PI = acos(-1.0);
const double EXP = 1E-8;
const int INF = 0x3f3f3f3f;
int t,n,m,k,q;
int ans,cnt,flag,temp;
ll l,r;
int main()
{
#ifdef DEBUG
freopen("input.in", "r", stdin);
//freopen("output.out", "w", stdout);
#endif
scanf("%d",&t);
while(t--){
scanf("%lld%lld",&l,&r);
if(l>r){
swap(l,r);
}
temp=0;
if(l%2==0){
l++;
}
if(r%2==1){
temp++;
r--;
}
printf("%lld\n",(r-l+1)/2+temp);
}
//cout << "Hello world!" << endl;
return 0;
}
C++版本二
AC版本
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<math.h>
#include<vector>
using namespace std;
vector<int> V;
int solve(int x)
{
if(x==0) return 0;
if(x==1) return 1;
int y=lower_bound(V.begin(),V.end(),x)-V.begin();
if(V[y]==x) return x/2;
int dif=V[y]-x;
return solve(dif)+(x-dif)/2;
}
int main()
{
V.push_back(2);
int x=2;
while(x<=(int)1e9)
{
x=x*2;
V.push_back(x);
}
int T;
scanf("%d",&T);
while(T--)
{
int l,r;
scanf("%d%d",&l,&r);
printf("%d\n",solve(r)-solve(l-1));
}
return 0;
}
C++版本三
符合题意版本
/*
*@Author: STZG
*@Language: C++
*/
#include <bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<string>
#include<vector>
#include<bitset>
#include<queue>
#include<deque>
#include<stack>
#include<cmath>
#include<list>
#include<map>
#include<set>
//#define DEBUG
#define RI register int
using namespace std;
typedef long long ll;
//typedef __int128 lll;
const int N=100000+10;
const int MOD=1e9+7;
const double PI = acos(-1.0);
const double EXP = 1E-8;
const int INF = 0x3f3f3f3f;
int t,n,m,k,q;
int ans,cnt,flag,temp;
ll l,r;
int main()
{
#ifdef DEBUG
freopen("input.in", "r", stdin);
//freopen("output.out", "w", stdout);
#endif
//scanf("%d",&n);
scanf("%d",&t);
while(t--){
scanf("%lld%lld",&l,&r);
if(l>r){
swap(l,r);
}
if(l%2==0){
if(__builtin_popcount(l-1)%2==0)
l--;
else
l++;
}
if(r%2==1){
if(__builtin_popcount(r-1)%2==0)
r++;
else
r--;
}
printf("%lld\n",(r-l+1)/2);
}
//cout << "Hello world!" << endl;
return 0;
}