CodeForces 346A--博弈
2016-07-22 21:59
239 查看
题意:
两个人从集合中取数,任意取出两个不同的数,集合中不能包含取出数的 |x-y|,如果谁取出的两个数字中的 |x-y|在集合中,那么这个人就
输了,输出获胜一方的名字。
输入:
输出:
分析:
游戏结束的标志是无法取出两个不同的数,即无论取出那两个数字,他们的绝对差都在集合中,换句话说,最终状态就是一个首项
等于公差的等差数列,求出这个数列的项数减 n 就是游戏进行的回合数。所以我们要先求出首项。设首项为d,接下来d+d,d+2d….后面几项都是首项的倍数,所以我们可以用gcd(a1,a2,a3…an)求出。ans = an / gcd(a1,a2..an) - n;求出游戏的回合数之后本着
ABAB....的情况输出获胜一方就可以。
代码:
#include <bits/stdc++.h>
using namespace std;
int a[105];
int gcd(int x, int y)
{
return y?gcd(y,x%y):x;
}
int main()
{
int n, t = 0;
cin >>n;
for (int i = 0; i < n; ++i)
{
cin >>a[i];
t = max(t, a[i]);
}
int maxn=t;
for(int i=0; i<n-1; i++)
{
for(int j=i+1; j<n; j++)
{
int l=gcd(a[i], a[j]);
t=gcd(t,l);
}
}
int k=maxn/t-n;
puts(k & 1 ? "Alice" : "Bob");
return 0;
}
两个人从集合中取数,任意取出两个不同的数,集合中不能包含取出数的 |x-y|,如果谁取出的两个数字中的 |x-y|在集合中,那么这个人就
输了,输出获胜一方的名字。
输入:
2 2 3
2 5 3
3 5 6 7
输出:
Alice
Alice
Bob
分析:
游戏结束的标志是无法取出两个不同的数,即无论取出那两个数字,他们的绝对差都在集合中,换句话说,最终状态就是一个首项
等于公差的等差数列,求出这个数列的项数减 n 就是游戏进行的回合数。所以我们要先求出首项。设首项为d,接下来d+d,d+2d….后面几项都是首项的倍数,所以我们可以用gcd(a1,a2,a3…an)求出。ans = an / gcd(a1,a2..an) - n;求出游戏的回合数之后本着
ABAB....的情况输出获胜一方就可以。
代码:
#include <bits/stdc++.h>
using namespace std;
int a[105];
int gcd(int x, int y)
{
return y?gcd(y,x%y):x;
}
int main()
{
int n, t = 0;
cin >>n;
for (int i = 0; i < n; ++i)
{
cin >>a[i];
t = max(t, a[i]);
}
int maxn=t;
for(int i=0; i<n-1; i++)
{
for(int j=i+1; j<n; j++)
{
int l=gcd(a[i], a[j]);
t=gcd(t,l);
}
}
int k=maxn/t-n;
puts(k & 1 ? "Alice" : "Bob");
return 0;
}
相关文章推荐
- HDU 1010 Tempter of the Bone 搜索 奇偶剪枝
- 百鸡问题
- KMP算法讲解
- 【嵌入式学习日记】2016年7月22日
- cocos实现按钮多种状态监听
- [Asp.Net]登录协同工作平台安全解决方案(优化版)
- linux下用mii-tool和ethtool 查看网线是否正确连接到网卡
- 复杂链表的复制
- 利用pxe和kickstart批量安装Linux客户端CentOS6.5
- 前端书籍推荐
- 读书笔记-现代操作系统-8多处理机-8.3虚拟化
- Task set generation
- docker容器扫盲
- IP协议首部详细分析
- Linux下修改文件的时间属性
- mysql 基本操作练习
- JavaScript面向对象及原型的理解及笔记整理【一】
- 解决linux下解压来自windows的zip文件产生乱码的问题
- 第五天:初始化SDRAM 设置S5PV210时钟系统
- 使用sm2签名并验签efi文件