Little Victor adores the sets theory. Let us remind you that a set is a group of numbers where all numbers are pairwise distinct. Today Victor wants to find a set of integers S that has the following properties:
Help Victor find the described set.
The first line contains three space-separated integers l, r, k (1 ≤ l ≤ r ≤ 1012; 1 ≤ k ≤ min(106, r - l + 1)).
Print the minimum possible value of f(S). Then print the cardinality of set |S|. Then print the elements of the set in any order.
If there are multiple optimal sets, you can print any of them.
8 15 3
1 2 10 11
8 30 7
0 5 14 9 28 11 16
Operation represents the operation of bitwise exclusive OR. In other words, it is the XOR operation.
#include<stdio.h> #include<iostream> #include<string.h> #include<string> #include<ctype.h> #include<math.h> #include<set> #include<map> #include<vector> #include<queue> #include<bitset> #include<algorithm> #include<time.h> using namespace std; void fre() { freopen("c://test//input.in", "r", stdin); freopen("c://test//output.out", "w", stdout); } #define MS(x,y) memset(x,y,sizeof(x)) #define MC(x,y) memcpy(x,y,sizeof(x)) #define MP(x,y) make_pair(x,y) #define ls o<<1 #define rs o<<1|1 typedef long long LL; typedef unsigned long long UL; typedef unsigned int UI; template <class T1, class T2>inline void gmax(T1 &a, T2 b) { if (b>a)a = b; } template <class T1, class T2>inline void gmin(T1 &a, T2 b) { if (b<a)a = b; } const int N = 0, M = 0, Z = 1e9 + 7, ms63 = 0x3f3f3f3f; LL l, r, k, top; LL a[20], b[20]; LL ans, ansnum; void dfs(LL p, LL v, LL num) { if (num && v < ans) { ans = v; ansnum = num; MC(b, a); } if (p > top || num == k)return; dfs(p + 1, v, num); a[num+1] = p; dfs(p + 1, v^p, num + 1); } int main() { while (~scanf("%lld%lld%lld", &l,&r,&k)) { if (k == 3) { bool flag = 0; for (LL i = 2; i <= r; i <<= 1) { LL half = i / 2; LL z = i - 1; LL y = z + half; LL x = y^z; if (z >= l&&x <= r) { puts("0"); puts("3"); printf("%lld %lld %lld\n", x, y, z); flag = 1; break; } } if (flag)continue; } top = min(r, l + 4); ans = 1e18; dfs(l, 0, 0); printf("%lld\n", ans); printf("%lld\n", ansnum); for (int i = 1; i <= ansnum; ++i) { printf("%lld ", b[i]); }puts(""); } return 0; } /* 【题意】 给你一个区间[l,r],区间内最少取1个数,最多取k(1e12)个数。1<=k<=min(1e6,r-l+1)。 我们相使得所取数的异或值尽可能小。 【类型】 暴力 【分析】 首先,连续取2个相邻数的话,异或和很可能就为1 连续取4个相邻数的话,异或和很可能就为0 显然的是,在5个连续数a,b,c,d,e中, a^b^c^d和b^c^d^e必然有一个为0。 于是我们可以在小范围内,暴力dfs出一个解。 即k>=4和k为1或2的时候,我们都有决策了。 于是,剩下需要注意的就是k==3的时候。 关键就变成——如何取3个数并使得异或值为0。 然后我们可以采取的贪心策略是—— 首先,如果最大数和最小数的位数间隙为2或者更大的话,我们就可以有下面这种构造方案: 1100 1000 0100 于是,剩下最大数和最小数的位数间隙为1。 我们可以用以下 1100000…… 1011111…… 0111111…… 的方式做构造,这样3个数的范围会尽可能缩小。而且是上下界同时缩小,就可以了。 诗诗的做法是—— 取l最高位的1 11..0..0 10..1..0 l: 1..1..0 然后对于l,如果这一位为1,那么就走01;如果为0,就走00, 显然不影响三个数的大小关系且使得a>b>c中a的值尽可能小 其实本质相同。 */