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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

BZOJ 2154 Crash的数字表格 (莫比乌斯反演)

發布時間:2024/4/18 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BZOJ 2154 Crash的数字表格 (莫比乌斯反演) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Crash的數字表格

今天的數學課上,Crash小朋友學習了最小公倍數(Least Common Multiple)。對于兩個正整數a和b,LCM(a, b)表示能同時被a和b整除的最小正整數。例如,LCM(6, 8) = 24。回到家后,Crash還在想著課上學的東西,為了研究最小公倍數,他畫了一張NM的表格。每個格子里寫了一個數字,其中第i行第j列的那個格子里寫著數為LCM(i, j)。一個45的表格如下: 1 2 3 4 5 2 2 6 4 10 3 6 3 12 15 4 4 12 4 20 看著這個表格,Crash想到了很多可以思考的問題。不過他最想解決的問題卻是一個十分簡單的問題:這個表格中所有數的和是多少。當N和M很大時,Crash就束手無策了,因此他找到了聰明的你用程序幫他解決這個問題。由于最終結果可能會很大,Crash只想知道表格里所有數的和mod 20101009的值。

Input

輸入的第一行包含兩個正整數,分別表示N和M。

Output

輸出一個正整數,表示表格中所有數的和mod 20101009的值。

Sample Input

4 5

Sample Output

122

【數據規模和約定】

100%的數據滿足N, M ≤ 10^7。

題解

n < m
Ans=∑i=1n∑j=1mlcm(i,j)=∑i=1n∑j=1mijgcd(i,j)=∑d=1n∑i=1n∑j=1mijd[gcd(i,j)==d]=∑d=1n∑i=1n/d∑j=1m/dijd[gcd(i,j)==1]=∑d=1nd∑i=1n/d∑j=1m/dij[gcd(i,j)==1]令:Sum(n,m)=∑i=1n∑j=1mijf(x)=∑i=1n∑j=1mij[gcd(i,j)==x]g(x)=∑i=1n∑j=1mij[x∣gcd(i,j)]=x2∑i=1n/x∑j=1m/xij[1∣gcd(i,j)]=∑x∣dnf(d)則:f(x)=∑x∣dnμ(dx)g(d)f(1)=∑d=1nμ(d)d2Sum(nd,md)Ans=∑d=1nd∑i=1n/d∑j=1m/dij[gcd(i,j)==1]=∑d=1nd∑i=1n/dμ(i)i2Sum(nid,mid)\begin{aligned} Ans &amp;= {\sum_{i=1}^{n}\sum_{j=1}^{m}lcm(i,j)}\\ &amp;={\sum_{i=1}^{n}\sum_{j=1}^{m}\frac{ij}{gcd(i,j)}}\\ &amp;={\sum_{d=1}^{n}\sum_{i=1}^{n}\sum_{j=1}^{m}\frac{ij}ozvdkddzhkzd[gcd(i, j)==d]}\\ &amp;={\sum_{d=1}^{n}\sum_{i=1}^{n/d}\sum_{j=1}^{m/d}{ijd}[gcd(i, j)==1]}\\ &amp;={\sum_{d=1}^{n}d\sum_{i=1}^{n/d}\sum_{j=1}^{m/d}{ij}[gcd(i, j)==1]}\\ 令:Sum(n,m) &amp;={\sum_{i=1}^{n}\sum_{j=1}^{m}ij}\\ f(x) &amp;= {\sum_{i=1}^{n}\sum_{j=1}^{m}ij[gcd(i,j)==x]}\\ g(x)&amp;={\sum_{i=1}^{n}\sum_{j=1}^{m}ij[x|gcd(i,j)]}\\ &amp;={x^2\sum_{i=1}^{n/x}\sum_{j=1}^{m/x}ij[1|gcd(i,j)]}\\ &amp;={\sum_{x|d}^{n}f(d)}\\ 則:f(x)&amp;={\sum_{x|d}^{n}\mu(\fracozvdkddzhkzd{x})g(d)}\\ f(1)&amp;={\sum_{d=1}^{n}\mu(d)d^2{Sum(\frac{n}ozvdkddzhkzd,\frac{m}ozvdkddzhkzd)}}\\ Ans &amp;={\sum_{d=1}^{n}d\sum_{i=1}^{n/d}\sum_{j=1}^{m/d}{ij}[gcd(i, j)==1]}\\ &amp;=\sum_{d=1}^{n}d{\sum_{i=1}^{n/d}\mu(i)i^2{Sum(\frac{n}{id},\frac{m}{id})}}\\ \end{aligned} Ans:Sum(n,m)f(x)g(x)f(x)f(1)Ans?=i=1n?j=1m?lcm(i,j)=i=1n?j=1m?gcd(i,j)ij?=d=1n?i=1n?j=1m?dij?[gcd(i,j)==d]=d=1n?i=1n/d?j=1m/d?ijd[gcd(i,j)==1]=d=1n?di=1n/d?j=1m/d?ij[gcd(i,j)==1]=i=1n?j=1m?ij=i=1n?j=1m?ij[gcd(i,j)==x]=i=1n?j=1m?ij[xgcd(i,j)]=x2i=1n/x?j=1m/x?ij[1gcd(i,j)]=xdn?f(d)=xdn?μ(xd?)g(d)=d=1n?μ(d)d2Sum(dn?,dm?)=d=1n?di=1n/d?j=1m/d?ij[gcd(i,j)==1]=d=1n?di=1n/d?μ(i)i2Sum(idn?,idm?)?

  • μ(i)i2\mu(i)i^2μ(i)i2用前綴和預處理
    求f(x}的時候用分塊可以在n{\sqrt{n}}n?完成
    求Sum(x,y)的時候用分塊也可以在n{\sqrt{n}}n?完成
    所以一次詢問可以在O(n)的時間解決
  • 如果是多次詢問(10000次詢問)
    需要繼續化簡
    令T=id,考慮對T進行分塊Ans=∑d=1nd∑i=1n/dμ(i)i2Sum(nT,mT)=∑T=1nSum(nT,mT)∑i∣Tnμ(i)i2Ti\begin{aligned} 令T&amp;=id,考慮對T進行分塊\\ Ans &amp;=\sum_{d=1}^{n}d{\sum_{i=1}^{n/d}\mu(i)i^2{Sum(\frac{n}{T},\frac{m}{T})}}\\ &amp;={\sum_{T=1}^{n}Sum(\frac{n}{T}, \frac{m}{T})\sum_{i|T}^{n}\mu(i)i^2\frac{T}{i}} \end{aligned} TAns?=idT=d=1n?di=1n/d?μ(i)i2Sum(Tn?,Tm?)=T=1n?Sum(Tn?,Tm?)iTn?μ(i)i2iT??
  • ∑i∣Tnμ(i)i2Ti\sum_{i|T}^{n}\mu(i)i^2\frac{T}{i}iTn?μ(i)i2iT?是積性函數可以用線性篩預處理,令t = i × prime[j]
    • 線性篩的時候如果i % prime[j] = 0,則t對應的莫比烏斯函數為0,prime[j]的貢獻為g[i] * prime[j]
    • i % prime[j] != 0,符合積形函數直接相乘
    • i 為素數,g[i]=i?i2g[i] = i - i^2g[i]=i?i2
      Sum(x,y)可以在n\sqrt{n}n?完成
// 單次詢問 O(n) #include <bits/stdc++.h> #define LL long long #define P pair<int, int> #define lowbit(x) (x & -x) #define mem(a, b) memset(a, b, sizeof(a)) #define rep(i, a, n) for (int i = a; i <= n; ++i) #define maxn 10000006 #define mid ((l + r) >> 1) #define lc rt<<1 #define rc rt<<1|1 using namespace std;int mod = 20101009; int mo[maxn], prime[maxn], g[maxn]; bool vis[maxn]; int Sum(int x) {return (1ll * (1 + x) * x / 2) % mod; } void init() {mo[1] = 1;vis[1] = 1;int len = 0;for (int i = 2; i < maxn; ++i) {if (!vis[i]) {prime[len++] = i;mo[i] = -1;}for (int j = 0; j < len && 1ll * i * prime[j] < maxn; ++j) {int t = i * prime[j];vis[t] = 1;if (i % prime[j] == 0) {mo[t] = 0;break;}mo[t] = -mo[i];}} }int solve(int n, int m) {int i = 1, j;int sum = 0;while (i <= n) {j = min(n / (n/i), m / (m/i));sum += (1ll * (g[j] - g[i-1]) * Sum(n/i) % mod) * Sum(m/i) % mod;sum %= mod;i = j + 1;}return sum; }int main() { #ifndef ONLINE_JUDGE// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout); #endifinit();for (int i = 1; i < maxn; ++i) {g[i] = 1ll * i * i * mo[i] % mod;g[i] = (g[i] + g[i-1]) % mod;}int n, m;scanf("%d %d", &n, &m);if (n > m) swap(n, m);int i = 1, j;int ans = 0;while (i <= n) {j = min(n/(n/i), m/(m/i));int t = 1ll * (i + j) * (j - i + 1) / 2 % mod;ans += 1ll * solve(n/i, m/i) * t % mod;ans %= mod;i = j + 1;}printf("%d\n", (ans + mod) % mod);return 0;} // 單次詢問O(sqrt(n)) #include <bits/stdc++.h> #define LL long long #define P pair<int, int> #define lowbit(x) (x & -x) #define mem(a, b) memset(a, b, sizeof(a)) #define rep(i, a, n) for (int i = a; i <= n; ++i) #define maxn 10000006 #define mid ((l + r) >> 1) #define lc rt<<1 #define rc rt<<1|1 using namespace std;int mod = 20101009; int mo[maxn], prime[maxn], g[maxn]; bool vis[maxn]; int Sum(int x) {return (1ll * (1 + x) * x / 2) % mod; } void init() {// mo[1] = 1;g[1] = 1;vis[1] = 1;int len = 0;for (int i = 2; i < maxn; ++i) {if (!vis[i]) {prime[len++] = i;// mo[i] = -1;g[i] = (i - 1ll * i * i % mod) % mod;}for (int j = 0; j < len && 1ll * i * prime[j] < maxn; ++j) {int t = i * prime[j];vis[i * prime[j]] = 1;if (i % prime[j] == 0) {// mo[t] = 0;g[t] = 1ll * g[i] * prime[j] % mod;break;}// mo[t] = -mo[i];g[t] = 1ll * g[i] * g[prime[j]] % mod;}}for (int i = 2; i < maxn; ++i) {g[i] = (g[i] + g[i-1]) % mod;} }int main() { #ifndef ONLINE_JUDGE// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout); #endifinit();int n, m;scanf("%d %d", &n, &m);if (n > m) swap(n, m);int i = 1, j;int ans = 0;while (i <= n) {j = min(n/(n/i), m/(m/i));ans += (1ll * Sum(n/i) * Sum(m/i) % mod) * (g[j] - g[i-1]) % mod;ans %= mod;i = j + 1;}printf("%d\n", (ans + mod) % mod);return 0; }

總結

以上是生活随笔為你收集整理的BZOJ 2154 Crash的数字表格 (莫比乌斯反演)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。