真香警告!JitPack 開源庫整合平臺
阿新 • • 發佈:2022-05-09
題目連結:
https://codeforces.com/contest/1656
D. K-good
題目大意:
一個數如果能被 \(k\) 個不同的數表示,同時這 \(k\) 個數 % \(k\) 之後的餘數不同,那麼它是 \(k - good\) 數。給定 \(n\),如果它是 \(k - good\) 數,則輸出任意滿足的 \(k\),否則輸出 -1。
思路:
首先容易發現 \(n\) 可以表示為 \(\frac{k * (k + 1)}{2} + k * t(t = 0, 1, 2, ...)\)。
轉化一下得到 \(2 * n = k * (k + 1 + 2 * t)\),\(k\) 和 \(k + 1 + 2 * t\)
將 \(2 * n\) 分解一下,小的那個數就是 \(k\)。
程式碼:
#include <bits/stdc++.h> using namespace std; #define LL long long LL T, n; void solve(){ cin >> n; LL a = n * 2, b = 1; while (a % 2 == 0){ a /= 2; b *= 2; } LL k = min(a, b); cout << (k == 1 ? -1 : k) << "\n"; } int main(){ ios::sync_with_stdio(false);cin.tie(0); cin >> T; while (T -- ) solve(); return 0; }