您的位置:首页 > 产品设计 > UI/UE

2016 UESTC Training for Math Problem D-熄灯啦!(乱搞)

2016-06-09 03:24 447 查看
D - 熄灯啦!

Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others)


冬天的时候,寝室阿姨会给全栋楼断电,但众所周知,卿学姐的寝室的电是从来不会断!

这是什么原理嘞?谭爷想来好好研究下,好让自己的寝室不再断电!

假设全栋楼的电闸有 n 个,一开始全部闭合,有强迫症的阿姨每次操作必定要翻转不同的 k 个电闸的状态( k <= n ),谭爷准备求最少的操作次数使全楼断电。

如果不能成功给全楼断电则输出-1

Input

输入2个数:n,k (1 <=n <= 10^9, 1 <= k <= 10^9)。

Output

输出翻转次数的最小值。 如果不能成功翻转则输出-1;

解题思路:

讨论n,k的奇偶性:(实在过于复杂)
http://blog.csdn.net/susidian/article/details/50855245详细证明;
代码:

#include<bits/stdc++.h>
bool odd(long long n)
{
if(n&1)
return true;
else
return false;
}
int main()
{
long long  n,k,ans;
scanf("%lld%lld",&n,&k);
if(n%k==0)
ans=n/k;
else if(odd(n))
{
if(!odd(k))
ans=-1;
else if(odd(n/k))
ans=n/k+2;
else
ans=n/k+1;
}
else
{
if(n/2<k&&k<n-1&&!odd(k))
ans=3;
else if(n/2<k&&k<=n-1&&odd(k))
{
if(n%(n-k)==0)
{
if(odd(n/(n-k)))
ans=n/(n-k)+1;
else
ans=n/(n-k);
}
else
{
if(odd(n/(n-k)))
ans=n/(n-k)+1;
else
ans=n/(n-k)+2;
}
}
else if(k<=n/2&&!odd(k))
ans=n/k+1;
else if(k<=n/2&&odd(k))
{
if(odd(n/k))
ans=n/k+1;
else
ans=n/k+2;
}
}
printf("%lld",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  乱搞