题意:f(x)表示x分解为a*b且a b中均不含平方因子的方案数目(ab ba算两种),求f(1)+......+f(n)
思路:
可以发现这个跟莫比乌斯函数一样,不知道的自行百度。
那么题意可以简化为:
这不就很简单啦嘛,直接整除分块搞一下就OK的啦。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e7+10;
bool vis[maxn];
int prime[maxn];
int mu[maxn];
ll pre[maxn];
void init(){
mu[1]=pre[1]=1;
int tot=0;
for(int i=2;i<maxn;i++){
if(!vis[i]){
prime[tot++]=i;
mu[i]=-1;
}
for(int j=0;j<tot;j++){
if(i*prime[j]>maxn){
break;
}
vis[i*prime[j]]=1;
if(i%prime[j]==0){
mu[i*prime[j]]=0;
break;
}else{
mu[i*prime[j]]=-mu[i];
}
}
pre[i]=pre[i-1]+mu[i]*mu[i];
}
}
int main(){
init();
int T;
scanf("%d",&T);
while(T--){
int n;
scanf("%d",&n);
ll ans=0;
for(int l=1,r;l<=n;l=r+1){
r=n/(n/l);
ans+=(pre[r]-pre[l-1])*pre[n/l];
}
printf("%lld\n",ans);
}
return 0;
}