神奇的树
Time Limit: 1000MS Memory limit: 65536K
题目描述
SDUT有一颗神奇的苹果树。假如某天早上这树上有x个苹果,那么这树这一天会再结出x个苹果来,也就是说到了晚上会有2*x个苹果,到了深夜,会有专人人来摘苹果,而摘苹果的人总会使苹果数剩下当前数量对m的余数,也就是说假如当前数量为a,那么第二天早上会剩下a%m个苹果。也许聪明的你已经发现了,有可能从某一天开始,这棵树上就再也没有苹果了。那么给你第一天早上的苹果数,请你判断一下是否存在这一天,从这一天开始就再也没有苹果了。如果一直存在的话输出Yes,否则输出No。
输入
多组测试数据。每组测试数据都是一行两个整数,x和m。x表示第一天早上的
苹果树,m表示余数。1<=x,m<=10^5.
输出
每组测试数据输出单独一行,Yes或No。
示例输入
1 5 3 6
示例输出
No Yes
提示
今天比赛的第一题,题意很简单,只要标记一下每次取余的结果,再次出现说明出现了一个环,则永远不可能取光。。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <string>
#include <stdlib.h>
#include <queue>
#include <algorithm>
using namespace std;
int a[100001];
int main()
{
int x,m;
while(cin>>x>>m)
{
memset(a,0,sizeof(a)); //用来记录每次取余的结果是否出现过
int flag=1;
x=x*2;
while(1)
{
if(x%m==0) //表示取尽苹果,直接输出
{
flag=0;
break;
}
else
{
x=x%m;
if(a[x]) //a[x]为1,表示此时x已出现过,出现了环
{
flag=1;
break;
}
else a[x]=1; //标记已出现的余数
}
x=x*2;
}
if(flag)
cout<<"No"<<endl;
else cout<<"Yes"<<endl;
}
return 0;
}