题解:r-l+1<5:2^10暴力。
k=1:l即为解。
k=2:一定能构造出异或和为1的解,例如2,3。
k>=4:一定能构造出异或和为0的解,当k=4的时候一定可以选择连续的4个数使异或和为0,如2。3,4,5。
k=3:令m表示2^m大于l且最小的值。
设x=2^m-1,y=2^m+2^(m-1),z=2^m+2^(m-1)-1就是一个异或和为0的解,如果此时y>r,则答案至少是1(可以选择连续的两个数)。
11111
110000
101111 x,y,z满足这种关系。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define LL long long
#define I I64d
using namespace std;
LL l,r,k,sum,ans;
LL mark[100],pd[100],mi[1000];
LL cnt,cnt1;
void dfs(LL x,LL sum)
{
if (x==r+1)
{
if (!cnt||cnt>k) return;
if (sum<ans){
ans=sum; cnt1=cnt;
for (LL i=1;i<=cnt;i++)
mark[i]=pd[i];
}
return;
}
++cnt; pd[cnt]=x; dfs(x+1,sum^x);
--cnt; dfs(x+1,sum);
}
int main()
{
scanf("%I64d%I64d%I64d",&l,&r,&k);
if (r-l+1<5)
{
ans=1e12;
dfs(l,0);
printf("%I64d\n%d\n",ans,cnt1);
for (int i=1;i<=cnt1;i++)
printf("%I64d ",mark[i]);
printf("\n");
return 0;
}
if (k==1) {
printf("%I64d\n",l);
printf("1\n%I64d\n",l);
return 0;
}
if (k==2){
if (l&1) l++;
printf("1\n2\n");
printf("%I64d %I64d\n",l,l+1);
return 0;
}
if (k>=4){
if (l&1) l++;
printf("0\n4\n");
printf("%I64d %I64d %I64d %I64d\n",l,l+1,l+2,l+3);
return 0;
}
mi[0]=1; int t=0;
for(int i=1;;i++)
{
if (mi[i-1]>l) {
t=i-1;
break;
}
mi[i]=mi[i-1]*2;
}
LL x=mi[t]-1; LL y=mi[t]+mi[t-1]; LL z=mi[t]+mi[t-1]-1;
if (y<=r){
printf("0\n3\n");
printf("%I64d %I64d %I64d\n",x,y,z);
return 0;
}
if (l&1) l++;
printf("1\n2\n");
printf("%I64d %I64d\n",l,l+1);
return 0;
}