洛谷 P2257 YY的GCD(莫比烏斯反演)
題目大意
求 ∑ i = 1 n ∑ i = 1 m [ g c d ( i , j ) = p ] , p ∈ p r i m e s \sum_{i=1}^{n} \sum_{i=1}^m[gcd(i,j)=p],p \in primes ∑i=1n∑i=1m[gcd(i,j)=p],p∈primes
解題思路
首先看到這個 [ g c d ( i , j ) = p ] [gcd(i,j)=p] [gcd(i,j)=p],肯定要聯想到如下變換 g c d ( i , j ) = 1 ⇔ [ 1 n ] ⇔ ∑ d ∣ n μ ( d ) gcd(i,j)=1 \Leftrightarrow [\frac{1}{n}] \Leftrightarrow \sum_{d|n}\mu(d) gcd(i,j)=1⇔[n1]⇔∑d∣nμ(d)
因為需要求的是範圍內每種質數的 ∑ i = 1 n ∑ i = 1 m [ g c d ( i , j ) = p ] \sum_{i=1}^{n} \sum_{i=1}^m[gcd(i,j)=p] ∑i=1n∑i=1m[gcd(i,j)=p]之和,最後的問題就轉化為了:
∑ p ∈ p r i m e s ∑ i = 1 n ∑ i = 1 m [ g c d ( i , j ) = p ] \sum_{p\in primes} \sum_{i=1}^{n} \sum_{i=1}^m[gcd(i,j)=p] ∑p∈primes∑i=1n∑i=1m[gcd(i,j)=p]
考慮提取出 p p p然後化為上述能等價代換的形式,即:
∑ p ∈ p r i m e s ∑ i = 1 ⌊ n p ⌋ ∑ i = 1 ⌊ m p ⌋ [ g c d ( i , j ) = 1 ] \sum_{p\in primes} \sum_{i=1}^{\lfloor \frac{n}{p} \rfloor} \sum_{i=1}^{\lfloor \frac{m}{p} \rfloor}[gcd(i,j)=1] ∑p∈primes∑i=1⌊pn⌋∑i=1⌊pm⌋[gcd(i,j)=1]
然後再次轉換: ∑ p ∈ p r i m e s ∑ i = 1 ⌊ n p ⌋ ∑ i = 1 ⌊ m p ⌋ ∑ d ∣ g c d ( i , j ) μ ( d ) \sum_{p\in primes} \sum_{i=1}^{\lfloor \frac{n}{p} \rfloor} \sum_{i=1}^{\lfloor \frac{m}{p} \rfloor}\sum_{d|gcd(i,j)}\mu(d) ∑p∈primes∑i=1⌊pn⌋∑i=1⌊pm⌋∑d∣gcd(i,j)μ(d)
將最右端的求和提到最前面,改為列舉 d d d:
∑ p ∈ p r i m e s ∑ d = 1 m i n ( ⌊ n p ⌋ ⌊ m p ⌋ ) μ ( d ) ⌊ n d p ⌋ ⌊ m d p ⌋ ~~~~\sum_{p\in primes} \sum_{d=1}^{min(\lfloor \frac{n}{p} \rfloor\lfloor \frac{m}{p} \rfloor)}\mu(d)\lfloor \frac{n}{dp} \rfloor\lfloor \frac{m}{dp} \rfloor ∑p∈primes∑d=1min(⌊pn⌋⌊pm⌋)μ(d)⌊dpn⌋⌊dpm⌋
這時似乎已經可以寫了,冷靜分析一波時間複雜度, 1 e 7 1e7 1e7內大約有 3 e 6 3e6 3e6個素數,再加上後面的 n \sqrt{n} n,我們發現應該會 T L E TLE TLE
這時一個至關重要的變換技巧需要知道:
設 T = d p T=dp T=dp,那麼:
∑ p ∈ p r i m e s ∑ d = 1 m i n ( ⌊ n p ⌋ ⌊ m p ⌋ ) μ ( d ) ⌊ n T ⌋ ⌊ m T ⌋ \sum_{p\in primes} \sum_{d=1}^{min(\lfloor \frac{n}{p} \rfloor\lfloor \frac{m}{p} \rfloor)}\mu(d)\lfloor \frac{n}{T} \rfloor\lfloor \frac{m}{T} \rfloor ∑p∈primes∑d=1min(⌊pn⌋⌊pm⌋)μ(d)⌊Tn⌋⌊Tm⌋
然後我們改為列舉 T T T,不難發現 T T T會取遍 [ 1 , m i n ( n , m ) ] [1,min(n,m)] [1,min(n,m)],而 d ∣ T d|T d∣T是已知的,那麼最終得到了如下式子:
∑ T = 1 m i n ( n , m ) ∑ p ∣ T , p ∈ p r i m e s μ ( T p ) ⌊ n T ⌋ ⌊ m T ⌋ \sum_{T=1}^{min(n,m)} \sum_{p|T,p \in primes}\mu(\frac{T}{p})\lfloor \frac{n}{T} \rfloor\lfloor \frac{m}{T} \rfloor ∑T=1min(n,m)∑p∣T,p∈primesμ(pT)⌊Tn⌋⌊Tm⌋
∑ p ∣ T , p ∈ p r i m e s μ ( T p ) \sum_{p|T,p \in primes}\mu(\frac{T}{p}) ∑p∣T,p∈primesμ(pT)的含義是對於某個 T T T,其最終的貢獻為所有單個質因子的另外相乘部分的貢獻累積,那麼考慮埃氏篩我們可以預處理每個 T T T的貢獻,最後不要忘了我們要對上述式子整除分塊,需要再對 T T T進行字首和預處理
總體時間複雜度 O ( n l o g n + T n ) O(nlogn+T\sqrt{n}) O(nlogn+Tn)
//
// Created by Happig on 2020/9/24
//
#include <bits/stdc++.h>
#include <unordered_map>
#include <unordered_set>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define ins insert
#define Vector Point
#define ENDL "\n"
#define lowbit(x) (x&(-x))
#define mkp(x, y) make_pair(x,y)
#define mem(a, x) memset(a,x,sizeof a);
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef pair<double, double> pdd;
const double eps = 1e-8;
const double pi = acos(-1.0);
const int inf = 0x3f3f3f3f;
const double dinf = 1e300;
const ll INF = 1e18;
const int Mod = 1e9 + 7;
const int maxn = 1e7 + 10;
vector<int> prime;
bitset<maxn> vis;
int mu[maxn];
ll sum[maxn];
void init() {
vis.reset(), prime.clear();
mu[1] = 1;
for (int i = 2; i < maxn; i++) {
if (!vis[i]) {
prime.push_back(i);
mu[i] = -1;
}
for (int j = 0; j < prime.size() && i * prime[j] < maxn; j++) {
vis[i * prime[j]] = 1;
if (i % prime[j]) {
mu[i * prime[j]] = -mu[i];
} else {
mu[i * prime[j]] = 0;
break;
}
}
}
for (int i = 0; i < prime.size(); i++) {
int p = prime[i];
for (int j = p; j < maxn; j += p) {
sum[j] += mu[j / p];
}
}
for (int i = 1; i < maxn; i++) sum[i] += sum[i - 1];
}
int main() {
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t, n, m;
init();
cin >> t;
while (t--) {
cin >> n >> m;
ll ans = 0;
int up = min(n, m);
for (int l = 1, r; l <= up; l = r + 1) {
r = min(n / (n / l), m / (m / l));
if (r > up) r = up;
ans += (sum[r] - sum[l - 1]) * (n / l) * (m / l);
}
cout << ans << ENDL;
}
return 0;
}
相關文章
- Hackerrank GCD Product(莫比烏斯反演)GC
- ZOJ 3868 GCD Expectation (容斥+莫比烏斯反演)GC
- HDU 1695 GCD (容斥 + 莫比烏斯反演)GC
- BZOJ 2818 Gcd (莫比烏斯反演 或 尤拉函式)GC函式
- 莫比烏斯反演
- SPOJ PGCD - Primes in GCD Table (好題! 莫比烏斯反演+分塊求和優化)GC優化
- 比較典的莫比烏斯反演
- FZU 1969 && UVA 11426 GCD Extreme (尤拉函式 或 莫比烏斯反演)GCREM函式
- 莫比烏斯反演學習筆記筆記
- 洛谷
- 狄利克雷卷積 & 莫比烏斯反演卷積
- HDU 4746 Mophues (莫比烏斯反演應用)
- POJ 3904 Sky Code (容斥+莫比烏斯反演)
- 洛谷團隊
- 昨天放洛谷的圖
- 狄利克雷卷積與莫比烏斯反演卷積
- 演算法隨筆——數論之莫比烏斯反演演算法
- 洛谷死亡時間
- 洛谷 - P5369
- 洛谷P6786
- 洛谷P1786
- HDU 5212 Code (容斥 莫比烏斯反演基礎題)
- Codeforces 548E Mike and Foam (容斥+莫比烏斯反演)
- Mzc和男家丁的遊戲(洛谷)遊戲
- 1280 洛谷 尼克的任務
- 洛谷網校學習
- 洛谷傻逼之處
- 洛谷八皇后問題
- 洛谷 - P6190
- 將洛谷私信接入WindowsWindows
- CSU 1325 A very hard problem (莫比烏斯反演+分塊求和優化)優化
- SPOJ VLATTICE Visible Lattice Points (莫比烏斯反演基礎題)
- ZOJ 3435 Ideal Puzzle Bobble (莫比烏斯反演基礎題)Idea
- 洛谷P1852 奇怪的字串字串
- 洛谷 1279 字串距離字串
- 洛谷 1057 傳球遊戲遊戲
- 洛谷 1781——宇宙總統(排序)排序
- 洛谷題單指南-字串-Test字串