NYOJ 788 又见Alice and Bob

举报
Linux猿 发表于 2021/08/05 00:02:19 2021/08/05
【摘要】 题目链接~~>                     一看见类似博弈的就不想做(但是这题和博弈没关系!!)。。。。 解题思路: 给一个原始集合,每次操作都会往集合中加入一个新的...

题目链接~~>

                    一看见类似博弈的就不想做(但是这题和博弈没关系!!)。。。。

解题思路: 给一个原始集合,每次操作都会往集合中加入一个新的元素,找出最后集合中元素的个数total,然后用 total-n 就是新加进去的元素个数。判断total-n 的奇偶性就可以判断出谁赢了。如何求total呢?如果开始时集合中只有2个数6  27,通过这两个数可以加进集合的数有21  15  9  3,这个过程实际上就是求gcd(6,27)的过程,最小的数就是gcd(6,27)=3,还发现集合中的元素都是3的倍数,那我们只需要判断[1,27]之间3的倍数有多少个就行了。   解法:求出n个数中的最大值Max和这n个数的最大公约数p,判断(Max / p — n)的  奇偶性即可。奇数Alice赢(因为集合中的数都是最大公约数的倍数,且不超过最大值,总个数就是最大数除以最大公约数)。

代码:


  
  1. #include<stdio.h>
  2. int g[120] ;
  3. int gcd(int x,int y) // 求公约数
  4. {
  5. int t ;
  6. while(y)
  7. {
  8. t=x%y ;
  9. x=y ;
  10. y=t ;
  11. }
  12. return x ;
  13. }
  14. int main()
  15. {
  16. int i,n,max,x,num ;
  17. while(scanf("%d",&n)!=EOF)
  18. {
  19. max=0 ;
  20. for(i=0 ;i<n ;i++)
  21. {
  22. scanf("%d",&g[i]) ;
  23. max=max < g[i] ? g[i] : max ;
  24. }
  25. x=g[0] ;
  26. for(i=1 ;i<n ;i++)
  27. x=gcd(x,g[i]) ;
  28. num=max/x-n ;
  29. printf("%s\n",num&1 ? "Alice" : "Bob") ; // 三目运算符很好用
  30. }
  31. return 0 ;
  32. }


 

 

 

文章来源: blog.csdn.net,作者:Linux猿,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/nyist_zxp/article/details/15500599

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。