题意:
输入n,m,寻找x∈[1,n)中gcd(x,n)>=m,有多少个x满足。
思路:
gcd(x,y)=i;
gcd(x/i,n/i)=1;
转化成求n/i的欧拉函数值(求小于一个数的质因数的个数),去重、特判要注意。
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
bool boo[50010];
ll E[20010];
ll oula(ll n)
{
ll rea=n;
for(ll i=2; i*i<=n; i++)
{
if(n%i==0)
{
rea=rea/i*(i-1);
while(n%i==0)
n=n/i;
}
}
if(n>1)
rea=rea/n*(n-1);
return rea;
}
int main()
{
ll T;
scanf("%lld",&T);
while(T--)
{
ll n,m;
scanf("%lld%lld",&n,&m);
ll ans=0;
for(ll i=1;i*i<=n;i++)
{
if(n%i==0)
{
if(i>=m)
ans+=oula(n/i);
if(i*i<n&&n/i>=m)
ans+=oula(i);
}
}
printf("%lld\n",ans);
}
return 0;
}
等哈在试试打表。