Yekaterinburg获得了2032年夏季奥运会的举办权。由于允许举办国对竞赛项目进行一些小的修改。现打算修改“Button”这个新项目的规则。规则很简单,在2个对手前有一堆扣子(k个),2人轮流取走扣子,同一时间,某人能取走1至L个扣子。取走最后一个扣子的为胜者。
作为奥运会项目,规则应该比通常玩的要难一点。先走者可以设定数K(就是总共有k个扣子),3 <= K <= 100 000 000.后走者可以设定数L,2 <= L < K。
现在要紧的问题是,请你写一个程序,帮助后走者做出抉择。换言之,当给出K后,你的程序能给出数L,使到后走者能获胜。
例如, 如果只有3个扣子,后走者把L定为2,有必胜把握。事实上,如果先走者取了1个扣子,那么后走者可以取剩下的2个扣子,后走者胜。如果先走者取了2个扣子,那么后走者取1个,也是后走者胜。
input:
输入只包含一个整数K,扣子的总数。
output:
输出L。每次最多能取走的扣子总数,要求保证后走者必胜。假如有多个答案,输出最小的。如果不存在保证能必胜的L,则输出0。
input:
3
output:
2
分析:
对于任意n,若n有约数i(包含n),那么i-1定为可行解,应为一开始处于mod i 的平衡状态,然后先手会打破这个状态,只要后手不断恢复平衡状态即可必胜。
【参考程序】:
#include<iostream>
#include<cmath>
using namespace std;
int n;
int main()
{
scanf("%d",&n);
for (int i=2;i<=(int) sqrt(n*1.0);i++)
if (n%(i+1)==0)
{
printf("%d\n",i);
exit(0);
}
if (n==4)
{
printf("%d\n",3);
exit(0);
}
if (n%2==0)
{
printf("%d\n",n/2-1);
exit(0);
}
printf("%d\n",n-1);
return 0;
}