【补题】CodeTON Round 1 (Div. 1 + Div. 2, Rated, Prizes!) D. K-good
题意:给一个n,如果能被k个数整除,要求这k个数%k后不相同,问如果可以,任意k是多少,如果不可以输出-1
思路: D. K-good_牛客博客
从来没见过,太诡异了,做题做少了
1.首先可以发现,一个数假如有数字p,那么可以得到n=x*k+(k*(k-1)/2)
然后将n*2,得到2*n=k*(2x+k-1)
2.如果我们设定k是偶数,那么(2x+k-1)就是奇数,并且k与(2x+k-1)是可以随意调换的,因为(2x+k-1)一定等于2n/k,这只是举例,k可以是偶数也可以是奇数
因此我们提取出一个数字的所有偶数部分,就可以得到奇数部分,然后从偶数和奇数部分选一个最小就行了
因为偶数或者奇数部分是由可能>=n的,很明显不符合题目要求,选min,找一个符合的出来即可
代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define IOS \std::ios::sync_with_stdio(0); \std::cin.tie(0); \std::cout.tie(0)const int N = 3e5 + 5;
const int INF = 1e18;
const int MOD = 998244353;
// const int MOD=1e9+7;
// const int MOD=100003;
const int maxn=5e5+10;void solve(){int n;cin >> n;int now=0;int t=2*n;while(n%2==0){n/=2;now++;}t/=n;if(n==1){cout << -1 << '\n';}else{cout << min(t,n) << '\n';}}signed main(){IOS;int t=1;cin >> t;while(t--){solve();}
}