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