日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

P3327 约数的个数和 [约数函数性质,数论分块]

發(fā)布時間:2023/12/3 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 P3327 约数的个数和 [约数函数性质,数论分块] 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

P3327 約數(shù)的個數(shù)和

題意

d(x)d(x)d(x)為約數(shù)的個數(shù),對于每個詢問,回答∑i=1n∑j=1md(ij)\sum_{i=1}^n\sum_{j=1}^md(ij)i=1n?j=1m?d(ij).

題解

這個題推得我頭皮發(fā)麻,然后還沒推出來,后來發(fā)現(xiàn)要做這題的先知道一個性質(zhì):

d(ij)=∑x∣i∑y∣j[gcd(x,y)=1]d(ij)=\sum_{x|i}\sum_{y|j}[gcd(x,y)=1]d(ij)=xi?yj?[gcd(x,y)=1]

通過這個性質(zhì),我們把原式寫成
∑i=1n∑j=1m∑x∣i∑y∣j[gcd(x,y)=1]\sum_{i=1}^n\sum_{j=1}^m\sum_{x|i}\sum_{y|j}[gcd(x,y)=1]i=1n?j=1m?xi?yj?[gcd(x,y)=1]

我們知道∑d∣xμ(d)=[x=1]\sum_{d|x}\mu(d)=[x=1]dx?μ(d)=[x=1],代換進(jìn)去,就得到了:

∑i=1n∑j=1m∑x∣i∑y∣j∑d∣gcd(x,y)μ(d)\sum_{i=1}^n\sum_{j=1}^m\sum_{x|i}\sum_{y|j}\sum_{d|gcd(x,y)}\mu(d)i=1n?j=1m?xi?yj?dgcd(x,y)?μ(d)

變枚舉i,ji,ji,j為枚舉x,yx,yx,y:

∑x=1n∑y=1m?nx??my?∑d∣gcd(x,y)μ(d)\sum_{x=1}^n\sum_{y=1}^m \lfloor \frac{n}{x} \rfloor \lfloor \frac{m}{y} \rfloor\sum_{d|gcd(x,y)}\mu(d)x=1n?y=1m??xn???ym??dgcd(x,y)?μ(d)

再轉(zhuǎn)為枚舉ddd,得到:

∑d=1μ(d)∑x=1n/d∑y=1m/d?nxd??myd?\sum_{d=1}\mu(d)\sum_{x=1}^{n/d}\sum_{y=1}^{m/d} \lfloor \frac{n}{xd} \rfloor \lfloor \frac{m}{yd} \rfloord=1?μ(d)x=1n/d?y=1m/d??xdn???ydm??

也即

∑d=1μ(d)(∑x=1n/d?nxd?)(∑y=1m/d?myd?)\sum_{d=1}\mu(d)(\sum_{x=1}^{n/d} \lfloor \frac{n}{xd} \rfloor) (\sum_{y=1}^{m/d} \lfloor \frac{m}{yd} \rfloor)d=1?μ(d)(x=1n/d??xdn??)(y=1m/d??ydm??)

f(x)=∑i=1x?xi?f(x)=\sum_{i=1}^x \lfloor \frac{x}{i} \rfloorf(x)=i=1x??ix??,則原式:

∑d=1μ(d)f(?nd?)f(?md?)\sum_{d=1}\mu(d)f(\lfloor \frac{n}ozvdkddzhkzd \rfloor)f(\lfloor \frac{m}ozvdkddzhkzd \rfloor)d=1?μ(d)f(?dn??)f(?dm??)

f(x)f(x)f(x)可以O(1)O(1)O(1)查詢的話,上面的式子就可以O(n)O(\sqrt{n})O(n?)數(shù)論分塊求出.

顯然,f(x)f(x)f(x)可以用O(nn)O(n\sqrt{n})O(nn?)的時間復(fù)雜度預(yù)處理出來,方法也是數(shù)論分塊.

代碼

// luogu-judger-enable-o2 #include <iostream> #include <algorithm> #include <cstring> #define pr(x) std::cout << #x << ':' << x << std::endl #define rep(i,a,b) for(int i = a;i <= b;++i) typedef long long LL; const int N = 50010; int n,m,T; int prime[N+10],mu[N+10],pcnt,zhi[N+10],low[N+10]; void sieve() {mu[1] = zhi[1] = 1;for(int i = 2;i <= N;++i) {if(!zhi[i]) {prime[pcnt++] = i;mu[i] = -1;}for(int j = 0;j < pcnt && i * prime[j] <= N;++j) {zhi[i*prime[j]] = 1;if(i % prime[j] == 0) {mu[i*prime[j]] = 0;break;}else{mu[i*prime[j]] = -mu[i];}}} } LL F[N+10]; int main() {std::ios::sync_with_stdio(false);std::cin >> T;sieve();for(int i = 1;i <= N;++i) {mu[i] += mu[i-1];}for(int i = 1;i <= N;++i) {for(int x = 1,last;x <= i;x = last+1) {last = i/(i/x);F[i] += (last-x+1)*(i/x);}}while(T--) {std::cin >> n >> m;LL ans = 0;int lim = n > m?m:n;for(int x = 1,nx1,nx2,nxt;x <= lim;x = nxt+1) {nx1 = n/(n/x);nx2 = m/(m/x);nxt = nx1>nx2?nx2:nx1;ans += (mu[nxt]-mu[x-1])*F[n/x]*F[m/x];}std::cout << ans << std::endl;}return 0; }

總結(jié)

以上是生活随笔為你收集整理的P3327 约数的个数和 [约数函数性质,数论分块]的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。