#include <stdio.h>#include <math.h>#include <stdlib.h>#include <string.h>#define N 100000/*...........................算法分析:1、首先遍历所有齿轮,求出齿轮与最小齿轮之间的倍数,并用一个数组record记录是否出现过这个倍数2、倍数之间如果出现了新的倍数关系,加进去3、进行乘法关系,乘法得到的结果小于一给定值4、进行匹配,看分子分母是否出现过5、BIT的同学们请不要直接Copy代码,否则后果不堪设想~~~~.............................*/static unsigned long number[N]; //对倍数的储存int mark[N]; //记录是否出现过int cmp(const void *a,const void *b){return *(long *)a- *(long *)b;}void Init() //初始化{int k=0;memset(number,0,sizeof(number));memset(mark,0,sizeof(mark));int n; //齿轮static unsigned long temp[30];scanf("%d",&n);int i,j,min=50000;for(i=0;i<n;i++){scanf("%lu",&temp[i]);if(temp[i]<min) min=temp[i]; //找最小值}qsort(temp,n,sizeof(temp[0]),cmp);for(i=0;i<n;i++){int flag=temp[i]/min;number[k++]=flag; //与最小倍数的关系mark[flag-1]=1; //做了标记}for(i=0;i<k;i++){for(j=0;j<k;j++){if(number[j]==0) continue;if(number[i]%number[j]==0){unsigned long tep = number[i]/number[j];if(tep==0) continue; //没有意义了if(mark[tep-1] != 1) //增加新的倍数关系{number[k++] = tep;mark[tep-1]=1;}}unsigned long tep= number[i]*number[j];if(tep > N||tep == 0) continue;//超出和为零没意义else{if(mark[tep-1]!=1){number[k++]=tep;mark[tep-1]=1;}}}}return;}long GCD(long a, long b) //求最大公约数,化简,以免错过倍数{long temp;temp=a>b?a:b;b=a<b?a:b;a=temp;temp=a%b;while(temp){a=b;b=temp;temp=a%b;}return b;}int main(){freopen("C:\\Users\\Seayar\\Desktop\\input.txt","r",stdin);Init();int set;scanf("%d",&set);while(set--){long mya,myb,a,b,temp,tep_a,tep_b;scanf("%ld%ld",&mya,&myb);a=mya;b=myb;temp=GCD(a,b);a/=temp;b/=temp;long n=1; //倍数扩大int flag=0; //标记while(1){tep_a=a*n;tep_b=b*n;if(tep_a>N||tep_b>N) break;if(mark[tep_a-1]==1&&mark[tep_b-1]==1){flag=1;break;}n++;}if(flag==0) printf("Gear ratio %ld:%ld cannot be realized.\n",mya,myb); else printf("Gear ratio %ld:%ld can be realized.\n",mya,myb); }return 0;}