[XJOI]二进制中连续k个1 题解
原题传送门[>XJOI<] 重要提示:您的等级必须达到三级五段,否则会被一只小猫痛扁
题目描述:
求最小的m,使得m>=n而且m的二进制表示包含至少连续k个1
输入格式:
输入两个整数n,k
输出格式:
输出一个整数
样例输入1:
7 2
样例输出1:
7
样例输入2:
364269800189924 33
样例输出2:
364273356242943
约定:
0<=n<250,1<=k<=50
解法:
今天没什么时间,我先简单讲讲
很简单,枚举长度为k的一段1,再在其他位上添加1使得m>=n
代码:(不要抄袭*INF)
#include <cstdio> long long bin[55]; int main() { long long n, k; scanf("%lld %lld", &n, &k); long long _bin = 1; bin[0] = 1; for (int i = 1; i <= 50; i++) { bin[i] = bin[i-1]*2; } long long k1 = 1; for (int i = 0; i < k; i++) k1 *= 2; k1--; long long temp, ans = 2251799813685248, cur_ans; if (k1 > n) printf("%lld", k1); else { while (k1 <= n) { temp = n - k1; cur_ans = k1; for (int i = 50; i >= 0; i--) { if (temp >= bin[i] && !(bin[i] & k1)) { temp -= bin[i]; cur_ans += bin[i]; } else if(cur_ans + bin[i] < ans && !(bin[i] & k1)) { ans = cur_ans + bin[i]; } } if (temp == 0) { if (cur_ans < ans) ans = cur_ans; } k1*=2; } printf("%lld", ans); } return 0; }
本篇博文全部原创,未经博主允许禁止转载