spoj.pl/problems/GCPC11A/
#include<stdio.h>
#include<math.h>
int a[1000001];
unsigned long long p[100000];
unsigned long long lim;
int main()
{ unsigned long long i,j,t,flag;
unsigned long long n,k,ans,num,x,sum,max,cnt,cnt1,num1,n1;
for ( i = 2 ; i <= 1000; ++i)
for ( j = i*i; j <= 1000000;j = j+i)
a[j] = 1;
p[0] = 2;
j = 1;
for ( i = 3; i <= 1000000; i = i+2)
if(a[i] == 0)
p[j++] = i;
lim = j-1;
scanf("%llu",&t);
while(t--)
{ scanf("%llu%llu",&n,&k);
// num=sqrt(k);
i = 0;
x = k;
max = 1;
cnt1 = 1;
flag = 0;
while( i <= lim && p[i] <= x)
{ cnt = 0;
n1 = 1;
while( x % p[i] == 0)
{ n1 *= p[i];
x /= p[i];
cnt++;
flag = 1;
}
if(max < n1)
{ max = n1;
cnt1 = cnt;
num1 = p[i];
}
++i;
}
if(flag == 0)
{ num1 = k;
max = x;
cnt1 = 1;
}
ans = num1;
sum = 0;
num = n/ans;
unsigned long long flow = 0xffffffffffffffff;
while(num)
{ sum += num;
ans *= num1;
if(ans > (flow/num1))
break;
num = n/ans;
}
printf("%llu\n",sum/cnt1);
}
return 0;
}