GCD
(a,b) can be easily found by the Euclidean algorithm. Now Carp is considering a little more difficult problem:
Given integers N and M, how many integer X satisfies 1<=X<=N and (X,N)>=M.
#pragma comment(linker,"/STACK:1024000000,1024000000")
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<stack>
#include<queue>
#include<deque>
#include<set>
#include<map>
#include<cmath>
#include<vector>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> PII;
#define pi acos(-1.0)
#define eps 1e-10
#define pf printf
#define sf scanf
#define lson rt<<1,l,m
#define rson rt<<1|1,m+1,r
#define e tree[rt]
#define _s second
#define _f first
#define all(x) (x).begin,(x).end
#define mem(i,a) memset(i,a,sizeof i)
#define for0(i,a) for(int (i)=0;(i)<(a);(i)++)
#define for1(i,a) for(int (i)=1;(i)<=(a);(i)++)
#define mi ((l+r)>>1)
#define sqr(x) ((x)*(x))
const int inf=0x3f3f3f3f;
ll m,n,ans;
int t;
ll ouler(ll n)
{
ll res=n;
for(ll i=2;sqr(i)<=n;i++)
{
if(!(n%i))
{
res=res/i*(i-1);
while(!(n%i))n/=i;
}
}
if(n>1)res=res/n*(n-1);
return res;
}
int main()
{
sf("%d",&t);
while(t--)
{
ans=0;
sf("%I64d%I64d",&n,&m);
for(ll i=1;sqr(i)<=n;i++)
if(!(n%i))
{
if(i>=m&&sqr(i)!=n)//當i和n/i相同時只能計算一次
ans+=ouler(n/i);
if(n/i>=m)
ans+=ouler(i);//分別計算i和n/i的歐拉函數值
}
pf("%I64d\n",ans);
}
return 0;
}