Rinne Loves Sequence
Posted H-w-H
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Rinne Loves Sequence相关的知识,希望对你有一定的参考价值。
Rinne Loves Sequence
推式子
∑
i
=
1
n
∑
j
=
i
+
1
n
[
g
c
d
(
a
i
,
a
j
)
=
1
]
∑
i
=
1
n
∑
j
=
1
n
[
g
c
d
(
i
,
j
)
=
1
]
×
c
n
t
i
×
c
n
t
j
−
∑
i
=
1
n
[
g
c
d
(
i
,
i
)
=
1
]
∑
d
=
1
n
μ
(
d
)
∑
i
=
1
n
∑
j
=
1
n
c
n
t
i
×
c
n
t
j
∑
d
=
1
n
μ
(
d
)
∑
i
=
1
n
d
∑
j
=
1
n
d
c
n
t
i
d
×
c
n
t
j
d
\\sum_i=1^n\\sum_j=i+1^n[gcd(a_i, a_j)=1]\\\\ \\sum_i=1^n\\sum_j=1^n[gcd(i,j)=1]\\times cnt_i\\times cnt_j-\\sum_i=1^n[gcd(i,i)=1]\\\\ \\sum_d=1^n\\mu(d)\\sum_i=1^n\\sum_j=1^ncnt_i\\times cnt_j\\\\ \\sum_d=1^n\\mu(d)\\sum_i=1^\\frac nd\\sum_j=1^\\frac ndcnt_id\\times cnt_jd\\\\
i=1∑nj=i+1∑n[gcd(ai,aj)=1]i=1∑nj=1∑n[gcd(i,j)=1]×cnti×cntj−i=1∑n[gcd(i,i)=1]d=1∑nμ(d)i=1∑nj=1∑ncnti×cntjd=1∑nμ(d)i=1∑dnj=1∑dncntid×cntjd
解释
添加一个数产生的贡献是:找到当前这个数的所有因子,用 μ ( d ) × c n t d \\mu(d)\\times cnt_d μ(d)×cntd表示当前这个数对应的 d d d产生的贡献。
同理删除一个数的贡献就是减去 μ ( d ) × c n t d \\mu(d)\\times cnt_d μ(d)×cntd。
C o d e Code Code
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
// #define int long long
const int N = 5e5+10;
int p[N], tot, mu[N];
bool st[N];
vector<int> fac[N];
void init()
mu[1] = 1;
for(int i=2; i<N; i++)
if(!st[i]) p[tot++] = i, mu[i] = -1;
for(int j=0; j<tot&&i*p[j]<N; j++)
st[i*p[j]] = 1;
if(i % p[j] == 0) break;
mu[i*p[j]] = -mu[i];
for(int i=1; i<N; i++)
for(int j=i; j<N; j+=i)
fac[j].push_back(i);
int vis[N], num[N];
signed main()
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
#endif
init();
ll n, ans = 0;
scanf("%lld", &n);
for(int i=1; i<=n; i++)
int f, x;
cin >> f >> x;
if(f == 1)
if(vis[x]) continue;
vis[x] = 1;
for(auto it : fac[x])
ans += mu[it] * num[it];
num[it]++;
else if(f == 2)
if(!vis[x]) continue;
vis[x] = 0;
for(auto it : fac[x])
num[it]--;
ans -= mu[it] * num[it];
else
cout << ans << endl;
return 0;
以上是关于Rinne Loves Sequence的主要内容,如果未能解决你的问题,请参考以下文章