版权声明:菜鸡blog,随便转载 https://blog.csdn.net/qq_36808030/article/details/86486847
题意:
问多少对 满足 且
题解:
先考虑什么情况满足
设
,则
因为
互质,所以
也互质
那么就是
因为
所以
设
直接算就好了,复杂度什么的不存在的
code:
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<cmath>
#define LL long long
using namespace std;
bool v[100010];
LL prime[100010],pr=0,mu[100010];
void pre()
{
memset(v,true,sizeof(v));
mu[1]=1;
for(LL i=2;i<=100000;i++)
{
if(v[i]) prime[++pr]=i,mu[i]=-1;
for(LL j=1;j<=pr&&i*prime[j]<=100000;j++)
{
LL s=i*prime[j];v[s]=false;
if(i%prime[j]==0) {mu[s]=0;break;}
mu[s]=-mu[i];
}
}
}
LL n,m;
LL calc(LL n,LL m)
{
LL ans=0;
LL k;
for(LL i=1;i<=m;i++)
{
LL t=n/i;
for(LL j=i+1;j<(i<<1)&&j<=t;j=k+1)
{
k=min((i<<1)-1,t/(t/j));
ans+=(k-j+1)*(t/j);
}
}
return ans;
}
int main()
{
pre();
scanf("%lld",&n);m=sqrt(n);
LL ans=0;
for(LL i=1;i<=m;i++) if(mu[i]!=0) ans+=mu[i]*calc(n/i/i,m/i);
printf("%lld",ans);
}