加入一直乘以二加上去的话只能构造到的时候就超过了
所以需要考虑为奇数的情况的操作
发现每一次递归下去都会让函数值
也就是说,奇数和偶数的函数变换只是让函数值而已,那么显然是选择奇数的变换更优
也就是说我们倒推回去,一直执行和就能得到最小的
这么构造最优,预处理即可
发现最大能构造到
然而我这个***,一开始把奇数的
这么转换之后,就再也没看出什么规律。
#include <bits/stdc++.h> using namespace std; #define int long long int a[209]; signed main() { memset( a,-1,sizeof a ); int temp = 2; a[1] = 1; a[2] = 2; for(int i=3;i<=120;i++) if( !(i&1) ) a[i] = temp-1,temp-=1; else a[i] = temp*2,temp*=2; int t,x; cin >> t; while( t-- ) { int x; cin >> x; if( x>120 ) printf("-1\n"); else printf("%lld\n",a[x] ); } }