Codeforces Round #636 A. Candies
May 14, 2020
問題
手元にキャンディの包み紙がn
枚ある
わかっているのはキャンディを買い始めて、初日はx
個、2日目は2x
個、3日目は4x
個、k
日目は2^(k-1)
を買ったこと
x
に当てはまる数を答えろという問題
以下のことが保証されている
x
,k
共に正の数かつ、k > 1
- 必ず条件を満たす
x
,k
が存在する
考えたこと
2変数あるときは片方を固定してみると、解法が見えることがある.
仮にk=3
とした場合
n == x + 2x + 4x
- ->
n == 7x
k=5
とした場合は
n == x + 2x + 4x + 8x + 16x
- ->
n == 31x
という事になる。
ここから、2の累乗を足していって、その数でn
が割れれば、x
は正数になりそう.2^30
くらいで制約のn <= 10^9
を超えてるので、そんなに計算量もかからない
あとはk > 1
という制約を忘れないようにしよう(k == 1だと、x == n
が答えになってしまう)
提出したコード
int main() {
int t; cin >> t;
rep(_, t) {
ll n; cin >> n;
// 2日目から始まるようにする(1 + 2 == 3)
ll sum = 3;
ll bi = 2;
while(n%sum != 0) {
bi *= 2;
sum += bi;
}
// 割り切れたら、割った数=xである
cout << n/sum << endl;
}
return 0;
}