【♂Not The Triumph♂O(∩_∩)O哈哈~But The Struggle♂】

竞赛决不是捷径,它只是另一种艰辛的生活方式。得到与失去,只有时间会去评判;成功与失败,只有历史能去仲裁。我不会永远成功,正如我不会永远失败一样

  C++博客 :: 首页 :: 联系 ::  :: 管理
  6 Posts :: 239 Stories :: 25 Comments :: 0 Trackbacks

常用链接

留言簿(7)

我参与的团队

搜索

  •  

积分与排名

  • 积分 - 104696
  • 排名 - 233

最新评论

阅读排行榜

评论排行榜

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;
}
posted on 2009-06-13 20:24 开拓者 阅读(245) 评论(0)  编辑 收藏 引用 所属分类: URAL 题解

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理