题解:LCM
題意:
推式子
我們考慮把這個式子的形式轉(zhuǎn)變一下
首先,分別整除可以轉(zhuǎn)變成他們的 \(gcd\) 整除
其次,考慮整除一個平方項,我們可以聯(lián)想到一個歐拉函數(shù) \(\mu\)
于是,我們要求的式子就變成了
\[ \sum_{a=1}^A \sum_{b=1}^B [\mu(gcd(a,b))\neq 0] \frac{a*b}{gcd[a,b]} \]
很明顯這里就是一個莫比烏斯反演的式子,然后按照套路把 \(gcd\) 提出來
\[ \sum_{\mu(k) \ neq 0 } \frac{1}{k} \sum_{a=1}^A \sum_{b=1}^B [gcd(a,b)==k] \frac{a*b}{gcd[a,b]} \]
\[ \sum_{\mu(k) \ neq 0 } k \sum_{a=1}^{\frac{A}{k}} \sum_{b=1}^{\frac{A}{k}} [gcd(a,b)==k] a*b \]
然后接下來的一部分和簡單數(shù)學題一樣,把后面的部分進行莫比烏斯反演,然后帶回來,得到
\[ Ans=\sum_{\mu(k) \ neq 0 } k \sum_{d=1}^{\frac{A}{k}} \mu(d) S\Big( \Big\lfloor \frac{n}{kd} \Big\rfloor \Big)^2 \]
按照套路 \(T=kd\)
\[ Ans=\sum_{T=1}^A S\Big(\Big\lfloor \frac{A}{T} \Big\rfloor \Big)^2 \sum_{d|T \mu(k) \neq 0 } \mu \Big(\frac{T}ozvdkddzhkzd\Big) \Big(\frac{T}ozvdkddzhkzd\Big)^2 d \]
到了這一步,我們已經(jīng)基本上可以做了,打一個簡單的 \(nlogn\) 的篩加上整除分塊,復雜度就變成了 \(nlogn+T\sqrt{n}\) ,常數(shù)優(yōu)秀一點就可以切掉了,但是我們還有更優(yōu)秀的線性篩
考慮可以把式子的后半部分表示成為
\[ g(T)=\sum_{d|T} \Big(\frac{T}ozvdkddzhkzd\Big) \Big(\frac{T}ozvdkddzhkzd\Big)^2 d *f(d) \]
當\(T\) 是質(zhì)數(shù)的時候
\[ g(T) = \mu(1) * 1 * x * f(x) + \mu(x) * x^2 * f(x)=x-x^2 \]
對于不是質(zhì)數(shù)的部分,我們考慮因式分解
\[ x=p_1^{q_1} p_2^{q_2} ....... p_k^{q_k} \]
我們發(fā)現(xiàn),當 \(q_i >3\) \(f(x)=0\)
那么,我們假設插入一個數(shù) \(p_1\)
這時候,當 \(q_1>1~~ f(p_1*x)=0\)
否則 ,就可以表示成為:
\[ g(x*p_1)=g(p_i^2)*g(p_2^{q_2}......p_k^{q_k}) \]
這兩個式子一定是互質(zhì)的,于是,我們就可以得到
\[ g(p_1^2)=\mu(p_1)*p_1^2*p_1*f(p_1)=-p_1^3 \]
然后我們就可以線性篩了
#include <bits/stdc++.h>using namespace std; #define re register #define gc getchar() inline int read() {re int x=0,f(1);re char ch=gc;while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=gc;}while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+(ch^48),ch=gc;return x*f; } #define ll long longconst int N=4e6+10,mod=1<<30; ll n,cn[N],pri[N],vis[N],cnt; ll s[N],po[N];void get(int n) {s[1]=cn[1]=1;for(int i=2;i<=n;++i){if (!vis[i]) po[i]=pri[++cnt]=i,s[i]=i-i*i,cn[i]=1;for(int j=1;j<=cnt&&i*pri[j]<=n;++j){vis[i*pri[j]]=1;if(i%pri[j]==0){cn[i*pri[j]]=cn[i]+1;po[i*pri[j]]=po[i];//*pri[j];if (cn[i]==1)s[i*pri[j]]=-(ll)pri[j]*pri[j]*pri[j]*s[i/po[i]];else s[i*pri[j]]=0;break;}else{s[i*pri[j]]=s[i]*s[pri[j]];po[i*pri[j]]=pri[j];cn[i*pri[j]]=1;}}}for(int i=2;i<=n;++i)s[i]+=s[i-1]; }ll ans;inline ll S(ll x) {return x*(x+1)/2;}int main() {int T=read();get(N-10);while(T--){ans=0;int a=read(),b=read();for(int l=1,r;l<=min(a,b);l=r+1){r=min(a/(a/l),b/(b/l));ans+=(1LL*S(a/l)*S(b/l)*(s[r]-s[l-1]));}cout<<(ans%mod+mod)%mod<<endl;}return 0; }轉(zhuǎn)載于:https://www.cnblogs.com/zijinjun/p/11051142.html
總結(jié)
- 上一篇: 『 效率工具 』Spring Boot版
- 下一篇: idea:忽略大小写提示设置