正文
NOIP幂次方
小程序:扫一扫查出行
【扫一扫了解最新限行尾号】
复制小程序
【扫一扫了解最新限行尾号】
复制小程序
#include<stdio.h>
int c[] = { ,,,,,,,,,,,,,,, };//由题意n最大为20000,所以最多会用到2的14次方
//为了防止mid+1出错,故写到15次方 int binarySearch(int x, int mid) {
if (x >= c[mid] && x < c[mid + ]) {
return mid;
}
if (x >= c[mid + ])
return ;
return -;
} int serch(int x) {//利用二分查找找到x的最大二次方
int left = ;
int right = ;
int mid;
while (left <= right) {
mid = (left + right) >> ;
if (binarySearch(x, mid) == -) {
right = mid - ;
}
else if (binarySearch(x, mid) == ) {
left = mid + ;
}
else {
return mid;
}
}
}
void divite(int x) {//分治求解:因为每个整数的划分方法是一样的
if (x == )
return;
int flag = serch(x);
int li = x - c[flag];
if (flag == ) {
printf("2(0)");
}
if (flag == ) {
printf("");
}
if (flag > ) {
printf("2(");
divite(flag);
printf(")");
}
if (li > ) {
printf("+");
divite(li);
}
} int main() {
int n;
scanf("%d", &n);
divite(n);
return ;
}