莫比烏斯反演的題目。
設
則
由莫比烏斯反演第二種形式,得到
當
總時間複雜度
//#include<bits/stdc++.h>
#include<stdio.h>
#include<cstring>
#include<cmath>
#include<iostream>
using namespace std;
const int MAXN=100100;
int p[MAXN],mu[MAXN],sum[MAXN],f[MAXN];
int a[MAXN],b[MAXN];
int n;
long long cal(int x)
{
long long i,ret=0;
for(i=x;i<=n;i+=x)
sum[a[b[i]]]++;
for(i=x;i<=n;i+=x)
ret+=sum[b[a[i]]];
for(i=x;i<=n;i+=x)
sum[a[b[i]]]--;
return ret;
}
int main()
{
int pcnt,i,j;
long long ans;
pcnt=0;
memset(p,0,sizeof(p));
memset(f,0,sizeof(f));
memset(sum,0,sizeof(sum));
mu[1]=1;
for(i=2;i<MAXN;i++)
{
if(!f[i])
{
p[++pcnt]=i;
mu[i]=-1;
}
for(j=1;p[j]*i<MAXN;j++)
{
f[p[j]*i]=1;
if(i%p[j]==0)
{
mu[p[j]*i]=0;
break;
}
mu[p[j]*i]=-mu[i];
}
}
while(~scanf("%d",&n))
{
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
for(i=1;i<=n;i++)
scanf("%d",&b[i]);
ans=0;
for(i=1;i<=n;i++)
{
if(mu[i])
ans+=mu[i]*cal(i);
}
printf("%lld\n",ans);
}
}