BZOJ 3994 [SDOI2015]约数个数和 (莫比乌斯反演)
題目大意:略
洛谷傳送門
首先要知道這樣一個公式不知道這個公式這道題還怎么做...
?
$d(ij)=\sum\limits_{x=1}^{i} \sum\limits_{y=1}^{j}[gcd(x,y)==1]$
具體證明可以參考這位神犇的博客
大意是說,令$k=i \cdot j$,把$k,i,j$都分解成質(zhì)因子冪次乘積的形式
那么對于其中一個質(zhì)因子$p$,$k,i,j$里,$p$的冪次分別為$c,a,b$
那么因為$p^{c}=p^{a} \cdot p^{b},c=a+b$
對于$k$的所有約數(shù),$p$能取的冪次是$0,1,2...c$,一共$c+1=a+b+1$種取值
而在上述式子中,保證$x,y$互質(zhì),則$x,y$中$p$的指數(shù),$x$取$0$,$y$取$[1,b]$,或者$x$取$[1,a]$,$y$取$0$,或者$x,y$都取$0$,一共$a+b+1$種取值,和上述論證吻合
而質(zhì)因子之間互不影響,所以推廣到多個質(zhì)因子上,這個結(jié)論依然是正確的
?
進入正題,我們有了這個公式,下面的推導就十分經(jīng)典套路了
$\sum\limits_{i=1}^{n} \sum\limits_{j=1}^{m} \sum\limits_{x|i} \sum\limits_{y|j} [gcd(x,y)==1]$
$\sum\limits_{i=1}^{n} \sum\limits_{j=1}^{m} \sum\limits_{x|i} \sum\limits_{y|j} \sum\limits_{d|gcd(x,y)} \mu(d)$
$\sum\limits_{d=1}^{n} \mu(d) \sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}\sum\limits_{x|i}\sum\limits_{y|j}[d|gcd(x,y)]$
$\sum\limits_{d=1}^{n} \mu(d) \sum\limits_{x=1}^{n}\sum\limits_{y=1}^{m}?\left \lfloor \frac{n}{x} \right \rfloor?\left \lfloor \frac{m}{y} \right \rfloor [d|gcd(x,y)]$
$\sum\limits_{d=1}^{n} \mu(d) \sum\limits_{x=1}^{n} \left \lfloor \frac{n}{dx} \right \rfloor?\sum\limits_{y=1}^{m} \left \lfloor \frac{m}{dy} \right \rfloor$?
令$g(n)=\sum\limits_{x=1}^{n}?\left \lfloor \frac{n}{x} \right \rfloor$
則$\sum\limits_{d=1}^{n} \mu(d) g(\left \lfloor \frac{n}ozvdkddzhkzd \right \rfloor) g(\left \lfloor \frac{m}ozvdkddzhkzd \right \rfloor )$
$g(n)$可以利用整除分塊的思想在$O(n\sqrt n)$的時間內(nèi)預(yù)處理出來
對于每個詢問也用整除分塊求解即可,總時間$O(T\sqrt n+n\sqrt n)$
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #define N1 50010 5 #define ll long long 6 #define dd double 7 #define inf 2147483647 8 #define maxn 50000 9 using namespace std; 10 11 ll g[N1]; 12 int pr[N1],mu[N1],smu[N1],use[N1],cnt; 13 void init() 14 { 15 int n,i,j,la; 16 for(n=1;n<=maxn;n++) 17 { 18 for(i=1;i<=n;i=la+1) 19 { 20 la=(n/(n/i)); 21 g[n]+=1ll*(la-i+1)*(n/i); 22 } 23 } 24 for(mu[1]=smu[1]=1,i=2;i<=maxn;i++) 25 { 26 if(!use[i]){ pr[++cnt]=i; mu[i]=-1; } 27 for(j=1;j<=cnt&&i*pr[j]<=maxn;j++) 28 { 29 use[i*pr[j]]=1; 30 if(i%pr[j]){ mu[i*pr[j]]=-mu[i]; } 31 else break; 32 } 33 smu[i]=smu[i-1]+mu[i]; 34 } 35 } 36 int n,m,T; 37 38 int main() 39 { 40 scanf("%d",&T); 41 init(); 42 int i,j,la;ll ans=0; ll inv,y; 43 while(T--) 44 { 45 scanf("%d%d",&n,&m); if(n>m) swap(n,m); ans=0; 46 for(i=1;i<=n;i=la+1) 47 { 48 la=min(n/(n/i),m/(m/i)); 49 ans+=1ll*(smu[la]-smu[i-1])*g[n/i]*g[m/i]; 50 } 51 printf("%lld\n",ans); 52 } 53 return 0; 54 }?
轉(zhuǎn)載于:https://www.cnblogs.com/guapisolo/p/10223833.html
總結(jié)
以上是生活随笔為你收集整理的BZOJ 3994 [SDOI2015]约数个数和 (莫比乌斯反演)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阿诺德图像加密c语言,基于Arnold置
- 下一篇: 数据结构与算法(6) -- heap