比赛 20120323 评测结果 ATTAAAATTT
题目名称 最大公约数 最终得分 50
用户昵称 TBK 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2012-03-24 08:42:15
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <string>
#include <iomanip>
#include <vector>
#include <set>
#include <algorithm>
#define MAXN 0x7fffffff
using namespace std;
int a[31000]={2},b,c,d,e,l,m,n=1,r[1000][2],x,z[1000000],y,k,t;
set<int> s;
void zhishu(void)
{
	for (l=3;l<=31499;l+=2)
	{
		for (m=0;m<n;m++)
			if (l%a[m]==0) break;
		if (m==n) 
		{
			a[n]=l;
			n++;
		}
	}
}
void fenjie(void)
{
	for (l=0;l<n;l++)
	{
		if (d==1) break;
		if (a[l]>(int)pow((double)d,0.5)) 
		{
			if (r[x][0]!=0) x++; 
			r[x][0]=d;
			r[x][1]++;
			x++;
			break;
		}
		if (d%a[l]==0) 
		{
			if ((a[l]!=r[x-1][0])||(x==0))
			{
				r[x][0]=a[l];
				r[x][1]++;
				d/=a[l];
				l--;
			}
		}
			else if (r[x][0]!=0) x++;
	}
	if (l==n) 
	{
		r[x][0]=d;
		r[x][1]++;
		x++;
	}
}
void yueshu(int y,int h)
{
	int i;
	if ((y==x)&&(h>=e)) 
	{
		z[k]=h;
		k++;
		return;
	}
	if (y==x) return;
	for (i=0;i<=r[y][1];i++) 
	{
		h*=(int)pow((double)r[y][0],(double)i);
		yueshu(y+1,h);
		h/=(int)pow((double)r[y][0],(double)i);
	}
}
int main(void)
{
	freopen("gcd.in","r",stdin);
	freopen("gcd.out","w",stdout);
	scanf("%d",&b);
	zhishu();
	for (c=0;c<b;c++)
	{
		scanf("%d%d",&d,&e);
		x=0;
		y=d;
		k=0;
		for (l=0;l<100;l++)
		{
			r[l][0]=0;
			r[l][1]=0;
		}
		fenjie();
		if (e==y) 
		{
			printf("1\n");
			continue;
		}
		if (e>y) 
		{
			printf("0\n");
			continue;
		}
		if ((e==1)||(e==0)) printf("%d\n",d);
			else 
			{
				yueshu(0,1);
				for (l=0;l<k;l++)
				{
					for (m=1;m<=y/z[l];m++)
						s.insert(z[l]*m);
				}
				t=s.size();
				printf("%d\n",t);
				s.clear();
			}
	}
	fclose(stdin);
	fclose(stdout);
	return 0;
}