暑假第三场积分赛----——H题最大公约数

描述

题目集合

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;
}

猜你喜欢

转载自blog.csdn.net/qq_41670466/article/details/81501514
今日推荐