正题
题目连接:http://www.51nod.com/Challenge/Problem.html#problemId=1675
题目大意
给出两个长度为nnn的序列a,ba,ba,b,求有多少对x,yx,yx,y满足
gcd(x,y)=1且abx=baygcd(x,y)=1且a_{b_x}=b_{a_y}gcd(x,y)=1且abx=bay
1≤n≤105,1≤ai,bi≤n1\leq n\leq 10^5,1\leq a_i,b_i\leq n1≤n≤105,1≤ai,bi≤n
解题思路
额挺明显的一个莫反,枚举约数ddd的时候用一个数组统计一下有多少个abxa_{b_x}abx就好了。
时间复杂度O(nlogn)O(n\log n)O(nlogn)
code
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=1e5+10;
ll n,cnt,ans,a[N],b[N],c[N],mu[N],pri[N/10];
bool v[N];
void Prime(){mu[1]=1;for(ll i=2;i<=n;i++){if(!v[i])pri[++cnt]=i,mu[i]=-1;for(ll j=1;j<=cnt&&i*pri[j]<=n;j++){v[i*pri[j]]=1;if(i%pri[j]==0)break;mu[i*pri[j]]=-mu[i];}}return;
}
signed main()
{scanf("%lld",&n);for(ll i=1;i<=n;i++)scanf("%lld",&a[i]);for(ll i=1;i<=n;i++)scanf("%lld",&b[i]);Prime();for(ll i=1;i<=n;i++){ll sum=0;for(ll j=i;j<=n;j+=i)c[a[b[j]]]++;for(ll j=i;j<=n;j+=i)sum+=c[b[a[j]]];for(ll j=i;j<=n;j+=i)c[a[b[j]]]--;ans+=sum*mu[i];}printf("%lld\n",ans);return 0;
}