51nod1675-序列变换【莫比乌斯反演】
生活随笔
收集整理的這篇文章主要介紹了
51nod1675-序列变换【莫比乌斯反演】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
正題
題目連接: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(nlog?n)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; }總結
以上是生活随笔為你收集整理的51nod1675-序列变换【莫比乌斯反演】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 51nod1836-战忽局的手段【期望d
- 下一篇: iQOO 12 手机屏幕参数公布:1.5