[51nod] 1613 翻硬币

1613 翻硬币

基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题
 
有 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
Analysis分析
详情请见曾加老师的答案= =
果然数论玩家都是这个显然那个显然= =然而吾此等凡夫俗子就得抓耳挠腮一晚上了
我最后也没推到完,只能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 }
qwq套结论打的

 

posted @ 2017-10-20 21:32  Leviaton  阅读(299)  评论(0编辑  收藏  举报