Recently, Peter saw the equation x0+2x1+4x2+...+2mxm=nx0+2x1+4x2+...+2mxm=n . He wants to find a solution (x0,x1,x2,...,xm)(x0,x1,x2,...,xm) in such a manner that ∑i=0mxi∑i=0mxi is minimum and every xixi (0≤i≤m0≤i≤m ) is non-negative.
Input
There are multiple test cases. The first line of input contains an integer TT (1≤T≤105)(1≤T≤105) , indicating the number of test cases. For each test case:
The first contains two integers nn and mm (0≤n,m≤109)(0≤n,m≤109) .
Output
For each test case, output the minimum value of ∑i=0mxi∑i=0mxi .
Sample Input
10 1 2 3 2 5 2 10 2 10 3 10 4 13 5 20 4 11 11 12 3
Sample Output
1 2 2 3 2 2 3 2 3 2
思路:关注方程左边x前的系数是不断上升的,有贪心可出答案(一开始没思路,就是没有观察到方程的性质特点)
#include<cstdio>
#include<math.h>
#include<string.h>
#include<vector>
#include<algorithm>
#include<queue>
#include<bitset>
#include<iostream>
#define pi pair<int,int>
#define CLR(a,b) memset(a,b,sizeof(a))
#define ll long long
using namespace std;
const int maxn=1e4+10;
ll a[32];
void init(void){
a[0]=1;
for(int i=1;i<=31;i++){
a[i]=a[i-1]*2;
}
}
int main(){
int t;
init();
while(~scanf("%d",&t)){
int n,m;
while(t--){
ll ans=0;
scanf("%d%d",&n,&m);
for(int i=31;i>=0;i--){
if(n/a[i]>0){
ans+=n/a[i];
n%=a[i];
}
}
printf("%lld\n",ans);
}
}
}