首先列出題目要求的式子 an
s=∑i
=1n∑
j=1n
d(ij
) an
s=∑i
=1n∑
j=1n
∑a|i
∑b|j
ajb[
(a,b
)=1]
你問我為啥?我也不知道 an
s=∑i
=1n∑
j=1n
∑a|i
∑b|j
ajb∑
d|(a
,b)μ
(d)=
∑d=1
nμ(d
)∑d|
an∑d
|bn∑
a|in
∑b|j
najb
=∑d=
1nμ(
d)∑d
|an∑
d|bn
∑a|i
n∑b|
jnaj
b=∑d
=1nμ
(d)∑
d|ad
n∑d|
bdn∑
ad|i
n∑bd
|jna
jb=∑
d=1n
μ(d)
∑a=1
⌊nd⌋
∑b=1
⌊nd⌋
∑i=1
⌊nad
⌋∑j=
1⌊nb
d⌋aj
bdb=
∑d=1
nμ(d
)∑a=
1⌊nd
⌋∑b=
1⌊nd
⌋∑i=
1⌊na
d⌋∑j
=1⌊n
bd⌋a
jd=∑
d=1n
dμ(d
)∑a=
1⌊nd
⌋a⌊⌊
nd⌋a
⌋∑b=
1⌊nd
⌋∑j=
1⌊nb
d⌋j
最後面那兩個
∑ 可以考慮用算貢獻的方法化簡 ∑b
=1⌊n
d⌋∑j
=1⌊⌊
nd⌋b
⌋j=∑
j=1⌊
nd⌋j
⌊⌊nd
⌋j⌋
令d(n
) 表示約數和函式d(
) 的前
n 項和。 d(
n)=∑
i=1n
i⌊ni
⌋ans
=∑d=
1nμ(
d)d(
⌊nd⌋
)2 d
μ(d)
可以杜教篩,
d 則可以小資料線性篩+大資料暴力。
時間複雜度o(
n23)
//杜教篩
#include
#include
#include
#define maxn 1000005
#define mod 1000000007ll
using namespace std;
typedef long long ll;
ll n, f[maxn+10], d[maxn+10];
int prime[maxn/10+10], mu[maxn+10], pr[maxn+10], prd[maxn+10];
bool mark[maxn+10];
void shai()
mu[i*prime[j]]=-mu[i];
prd[i*prime[j]]=prime[j];}}
for(i=1;i1]+(ll)i*mu[i])%mod, d[i]=(d[i-1]+d[i])%mod;
}ll s1(ll x)
ll getf(ll n)
}ll s
qr(ll x)
ll getd(ll n)
return ans;
}int main()
printf("%lld",(ans+mod)%mod);
return
0;}
51nod1220 約數之和
覆盤 bindir0 講的數論清真題,寫一篇題解來禍害自己。給定 n 求 sum sum sigma i cdot j 結果對 10 9 7 取模。2 leq n leq 10 9 無腦轉化式子 打表 無腦亂卷函式 不用推式子!按照一貫的套路,把 sigma 換一種寫法,但是注意 sigma 注意有...
51Nod 1220 約數之和 PE439
i 表示i的約數和 n i 1 nj 1 ij ni 1 nj 1 w i v jwv d w d i v u d 我們嘗試把d提前 會發現有 nd 1 d u d n d i 1 i 2後面 n d i 1 i 2可以看作f n d 對於 n d i 1 i 我們可以小資料預處理 大資料o n0....
51nod 1040 最大公約數之和
1040 最大公約數之和 rihkddd 基準時間限制 1 秒 空間限制 131072 kb 分值 80 難度 5級演算法題 給出乙個n,求1 n這n個數,同n的最大公約數的和。比如 n 6 1,2,3,4,5,6 同6的最大公約數分別為1,2,3,2,1,6,加在一起 15 input 1個數n ...