lyk有两序列a和b。
lyk想知道存在多少对x,y,满足以下两个条件。
1:gcd(x,y)=1。
2:
abx
=
bay
。
例如若a={1,1,1},b={1,1,1}。那么存在7对,因为除了x=2,y=2或x=3,y=3外都满足条件。
Input
第一行一个数n(1<=n<=100000)。 接下来一行n个数,表示ai(1<=ai<=n)。 接下来一行n个数,表示bi(1<=bi<=n)。
Output
一行表示答案
Input示例
3 1 1 1 1 1 1
Output示例
7
alpq654321
(题目提供者)
Visual C++的运行时限为:1000 ms ,空间限制为:131072 KB
示例及语言说明请按这里
允许其他 AC 的用户查看此代码,分享代码才能查看别人的代码并有机会获得勋章
一道莫比乌斯反演模板题。
我们可以定义:
f(k) 为满足 abx=bay 的情况下, gcd(x,y)=k 的数量。
F(k) 为满足 abx=bay 的情况下, gcd(x,y)=k的倍数 的数量。
则
F(k)=∑k|df(d)
由莫比乌斯反演第二种形式,得到
f(k)=∑k|du(dk)∗F(d)
当 k=1 时,
f(1)=∑d=1nu(d)∗F(d)
u(d) 通过线性筛实现, F(d) 可以通过平均复杂度 O(n√) 的暴力实现。
总时间复杂度 O(nn√)
#include<set>
#include<map>
#include<stack>
#include<queue>
#include<vector>
#include<string>
#include<math.h>
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<functional>
using namespace std;
#define ll long long
#define inf 1000000000
#define mod 1000000007
#define maxn 200008
#define lowbit(x) (x&-x)
#define eps 1e-9
ll mu[maxn],a[maxn]={1,1},b[maxn];
ll aa[maxn],bb[maxn],sum[maxn],n;
ll work(ll x)
{
ll i,res=0;
for(i=x;i<=n;i+=x)
sum[aa[bb[i]]]++;
for(i=x;i<=n;i+=x)
res+=sum[bb[aa[i]]];
for(i=x;i<=n;i+=x)
sum[aa[bb[i]]]--;
return res;
}
ll solve()
{
ll ans=0,i;
for(i=1;i<=n;i++)
if(mu[i])
ans+=mu[i]*work(i);
return ans;
}
int main(void)
{
ll i,j,cnt=0;
mu[1]=1;
for(i=2;i<maxn;i++)
{
if(a[i]==0)
b[++cnt]=i,mu[i]=-1;
for(j=1;j<=cnt && i*b[j]<maxn;j++)
{
a[b[j]*i]=1;
if(i%b[j]==0)
{
mu[i*b[j]]=0;
break;
}
else
mu[b[j]*i]=-mu[i];
}
}
scanf("%lld",&n);
for(i=1;i<=n;i++)
scanf("%lld",&aa[i]);
for(i=1;i<=n;i++)
scanf("%lld",&bb[i]);
printf("%lld\n",solve());
return 0;
}