描述
题目集合
A国的n个作战通信基站被C国的特种部队破坏,基站编号1到n,只剩下编号为a和b的通信基站完好,为了快速恢复通信,A国派出zzx和fk两位工程师去修复,A国的通信基站有一个特殊隐蔽的备用系统,只有让两个完好的通信基站向编号为x的基站发送信号,x是这两个完好基站编号的和或者差的绝对值,该被破坏的基站的备用系统才会被激活,工程师才能恢复被破坏的基站,假设zzx工程师先到达可修复的基站进行修复,接着fk去修复下一个,两人轮流修复,问谁会修复最后一个可修复的基站. 初始zzx已经修复的a,接着fk已经修复了b
输入
输入n,a,bn,a,b三个整数,代表基站的总数nn和剩下的完好的两个基站的编号a,ba,b.
1 < n <= 1e5,1 <= a,b <= n1<n<=1e5,1<=a,b<=n,且a!=ba!=b 处理到文件结束
输出
若zzx修复最后一个,输出 zzx,否则输出fk
输入样例 1
5 1 4 10 3 7 11 4 8
输出样例 1
zzx fk fk
这道题,我当初怎么都没想到是考的最大公约数,wa了九次,尝试了搜索,模拟。。。
题目分析:可以看出,在整个修复过程中,修复的基站号都是基于a,b的最大公约数的,如2,4,最大公约数是2,那么可修复的基站始终是2的倍数,但是如果最大公约数是1,那么就可以遍历所有的基站,那么n/gcd就得到了修复基站数,然后看是奇数还是偶数
代码
#include<cstdio>
int gcd(int a,int b){
return b==0?a:gcd(b,a%b);
}
int main(){
int T,n,a,b;
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
while(~scanf("%d %d %d",&n,&a,&b))
{
int v=gcd(a,b);
if((n/v)%2)
puts("zzx");
else
puts("fk");
}
return 0;
}