题意
求
∑
i
=
1
m
m
u
[
i
∗
n
]
n
<
=
1
e
12
m
<
=
2
e
9
\sum_{i=1}^{m}mu[i*n]\\ n<=1e12 m<=2e9
∑i=1mmu[i∗n]n<=1e12m<=2e9
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e6+10;
int n,m;
int mu[N],sum[N],prime[N],cnt,st[N];
void init(){
mu[1]=1;
for(int i=2;i<N;i++){
if(!st[i])
{
prime[cnt++]=i;
mu[i]=-1;
}
for(int j=0;j<cnt&&i*prime[j]<N;j++){
st[i*prime[j]]=true;
if(i%prime[j]==0)
{
// phi[i*prime[j]]=phi[i]*prime[j];
break;
}
mu[i*prime[j]]=-mu[i];
}
}
for(int i=1;i<N;i++)
sum[i]=sum[i-1]+mu[i];
}
unordered_map<int,int>mp1,mp2;
int sum_mu(int n){
if(n<N) return sum[n];
if(mp1.count(n)) return mp1[n];
int res=1;
for(int i=2,j;i<=n;i=j+1){
j=min(n,n/(n/i));
res-=(j-i+1)*sum_mu(n/i) ;
}
return mp1[n]=res;
}
int S(int m,int n){
if(m==0) return 0;
if(n==1) return sum_mu(m);
int p;
for(int i=0;prime[i]*prime[i]<=n;i++)
{
p=prime[i];
if(n%p==0){
return -S(m,n/p)+S(m/p,n);
}
}
p=n;
return -S(m,n/p)+S(m/p,n);
}
signed main(){
init();
cin>>m>>n;
int tt=n;
for(int i=0;i<cnt;i++){
if(tt%prime[i]==0){
int cnt=0;
while(tt%prime[i]==0)
tt/=prime[i],cnt++;
if(cnt>=2)
{
puts("0");
return 0;
}
}
}
cout<<S(m,n);
}