1. 程式人生 > 其它 >真香警告!JitPack 開源庫整合平臺

真香警告!JitPack 開源庫整合平臺

題目連結:

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\) 是由一個奇數和一個偶數相乘得到。
\(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;
}