有 n 个硬币,一开始全部正面朝上,每次可以翻转 k 个硬币( k 小于 n ),那么至少要 p 次翻转,才能让所有硬币反面朝上,求 p 的值。如果不能成功翻转则输出-1
Input
输入2个数:n,k (1 <= n <= 10^9, 1 <= k <= 10^9)。
Output
输出翻转次数的最小值。
如果不能成功翻转则输出-1
Input示例
6 5
Output示例
6
我最后也没推到完,只能get个大概
那么关键式子两条
And
这两条式子很迷,但就是关键
qwq
既然没推完,就不发出来了
Code代码
1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 5 long long n,k; 6 7 long long gcd(long long A,long long B){ 8 if(A < B) swap(A,B); 9 return (!B)?A:gcd(B,A%B); 10 } 11 12 int main(){ 13 scanf("%lld%lld",&n,&k); 14 15 long long ans = 0; 16 17 if(n%2){ 18 if(k%2 == 0){ cout << -1; return 0; } 19 else{ ans = n/k; if(n%k) ans++; if(ans%2 == 0) ans++; cout << ans; return 0; } 20 }else{ 21 if(k*2 > n && k < n-1 && k%2 == 0){ cout << 3; return 0; } 22 if(k*2 > n && k <= n-1 && k%2){ ans = n/(n-k); if(n%(n-k)) ans++; if(ans%2) ans++; cout << ans; return 0; } 23 if(2*k <= n && k%2 == 0){ ans = n/k; if(n%k) ans++; cout << ans; return 0; } 24 if(2*k <= n && k%2){ ans = n/k; if(n%k) ans++; if(ans%2) ans++; cout << ans; return 0; } 25 } 26 27 return 0; 28 }