hdu-2104

来源:互联网 发布:网络连不上说是防火墙 编辑:程序博客网 时间:2024/06/03 19:36

题目方法:出现第一个重复点一定会是你自己的位置(题目例子说的起点A),因为想到任何一个走过的点就必须先到你走过的点的前一个点,所以第一个出现重复的一定是起点(题目例子说的起点A),因为每个点都要走一次,所以总共要走n次m,并且在第n次走到第一个点,那么在第n次之前不存在一个i使得(m*i)% n = 0 .(i为第i个走到的点是起点)

超时做法(没有ac)

#include<iostream>#include<cstdio>using namespace std;int main(){int a,b,i;while(scanf("%d%d",&a,&b)){if(a==-1 && b==-1)break;for(i=1;i<=a;++i)if((b*i)%a==0){if(i==a)printf("YES\n");elseprintf("POOR Haha\n");break;}}return 0;}

 不会超时的做法(ac代码):(m*i)% n = 0,考察这个式子,也就是n,m互质,所以用辗转相除去解

 

#include<iostream>#include<cstdio>using namespace std;int gcd(int a,int b){    return b==0?a:gcd(b,a%b);}int main(){    int a,b;    while(scanf("%d%d",&a,&b))    {        if(a==-1 && b==-1)            break;        if(gcd(a,b)==1)            printf("YES\n");        else            printf("POOR Haha\n");    }    return 0;}

 

原创粉丝点击