-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathproblemC-educationalRound.java
More file actions
79 lines (72 loc) · 1.56 KB
/
Copy pathproblemC-educationalRound.java
File metadata and controls
79 lines (72 loc) · 1.56 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
import java.io.*;
public class problemCeducationalround {
public static void main(String[] args) throws IOException {
FastScanner sc=new FastScanner(System.in);
StringBuilder sb=new StringBuilder();
int t=sc.nextInt();
while (t-- > 0){
long s=sc.nextLong();
long m=sc.nextLong();
if (!feasible(s, m, s)){
sb.append(-1).append('\n');
continue;
}
long lo=1, hi=s;
while (lo < hi){
long mid=lo +(hi-lo)/2;
if (feasible(s, m, mid))hi=mid;
else lo=mid + 1;
}
sb.append(lo).append('\n');
}
System.out.print(sb);
}
static boolean feasible(long s, long m, long n) {
long deficit=s;
for (int j=59; j >= 0; j--){
if (((m >> j) & 1) == 1){
long use=Math.min(n, deficit >> j);
deficit-=use << j;
}
}
return deficit == 0;
}
//skeleton for fast scanner
private static final class FastScanner {
private final InputStream in;
private final byte[] buffer=new byte[1 << 16];
private int ptr=0;
private int len=0;
FastScanner(InputStream in) {
this.in=in;
}
int nextInt() throws IOException {
return (int) nextLong();
}
long nextLong() throws IOException {
int c;
while ((c=read()) <= ' ') {
if (c == -1) return Long.MIN_VALUE;
}
boolean neg=false;
if (c == '-') {
neg=true;
c=read();
}
long val=0;
while (c > ' ') {
val=val * 10 + (c - '0');
c=read();
}
return neg ? -val : val;
}
private int read() throws IOException {
if (ptr >= len) {
len=in.read(buffer);
ptr=0;
if (len <= 0) return -1;
}
return buffer[ptr++];
}
}
}