對於正整數n,定義f(n)為n所含質因子的最大冪指數。例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10007)=1, f(1)=0。
給定正整數a,b,求sigma(sigma(f(gcd(i,j)))) (i=1..a, j=1..b)。
BZOJ 3309 DZY Loves Math (莫比烏斯反演的應用 好題)
DZY Loves Math
Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 485 Solved: 199
[Submit][Status][Discuss]
Description
Input
第一行一個數T,表示詢問數。
接下來T行,每行兩個數a,b,表示一個詢問。
Output
對於每一個詢問,輸出一行一個非負整數作為回答。
Sample Input
4
7558588 9653114
6514903 4451211
7425644 1189442
6335198 4957
7558588 9653114
6514903 4451211
7425644 1189442
6335198 4957
Sample Output
35793453939901
14225956593420
4332838845846
15400094813
14225956593420
4332838845846
15400094813
HINT
【資料規模】
T<=10000
1<=a,b<=10^7
題目連結:http://www.lydsy.com/JudgeOnline/problem.php?id=3309
題目分析:參考巨巨部落格
列舉d=gcd(i,j)得到
令g(x) = Σ[d|T]f(d)μ(T/d)
觀察這個函式 由於含平方因子數的μ值都為零,因此我們只考慮μ(T/d)!=0的數
令T=p1^a1*p2^a2*...*pk^ak
d=p1^b1*p2^b2*...*pk^bk
如果存在ai≠aj(i≠j),那答案只取決於最大的冪,對於其餘部分通過組合數的性質,取得的數字個數為奇數和偶數的數量相等,因此和都是0,故如果存在ai≠aj(i≠j),則g(T)=0
如果所有的a值都相等,我們假設對於任意選取方案,f值都不變,那麼由於選取奇數個元素和偶數個元素的方案數相等,和仍然為0
但是有一種選取方案的f值=a-1 即d=p1*p2*p3*...pk時,因此要把那個減去,根據莫比烏斯函式性質,減去的是(-1)^k,因為是減去所以最終結果為(-1)^(k+1),故如果不存在ai≠aj,則g(T)=(-1)^(k+1)
#include <cstdio>
#include <cstring>
#include <algorithm>
#define ll long long
using namespace std;
int const MAX = 1e7 + 5;
//a表示最小素因子的冪,p_a表示最小素因子的乘積
int g[MAX], p[MAX], sum[MAX], a[MAX], p_a[MAX];
bool noprime[MAX];
void pre()
{
int pnum = 0;
for(int i = 2; i < MAX; i++)
{
if(!noprime[i])
{
p[pnum ++] = i;
g[i] = 1;
a[i] = 1;
p_a[i] = i;
}
for(int j = 0; i * p[j] < MAX; j++)
{
noprime[i * p[j]] = true;
if(i % p[j] == 0)
{
a[i * p[j]] = a[i] + 1;
p_a[i * p[j]] = p_a[i] * p[j];
if(i == p_a[i])
g[i * p[j]] = 1;
else
g[i * p[j]] = (a[i / p_a[i]] == a[i * p[j]] ? -g[i / p_a[i]] : 0);
break;
}
a[i * p[j]] = 1;
p_a[i * p[j]] = p[j];
g[i * p[j]] = (a[i] == 1 ? -g[i] : 0);
}
sum[i] = sum[i - 1] + g[i];
}
}
ll cal(int a, int b)
{
if(a > b)
swap(a, b);
ll ans = 0;
for(int i = 1, last = 0; i <= a; i = last + 1)
{
last = min(a / (a / i), b / (b / i));
ans += (ll) (a / i) * (b / i) * (sum[last] - sum[i - 1]);
}
return ans;
}
int main()
{
pre();
int T;
scanf("%d", &T);
while(T --)
{
int a, b;
scanf("%d %d", &a, &b);
printf("%lld\n", cal(a, b));
}
}
相關文章
- HDU 4746 Mophues (莫比烏斯反演應用)
- BZOJ 2818 Gcd (莫比烏斯反演 或 尤拉函式)GC函式
- 莫比烏斯反演
- Codeforces Round #254 (Div. 2) A DZY Loves Chessboard
- SPOJ PGCD - Primes in GCD Table (好題! 莫比烏斯反演+分塊求和優化)GC優化
- cf444E. DZY Loves Planting(並查集)並查集
- 比較典的莫比烏斯反演
- Hackerrank GCD Product(莫比烏斯反演)GC
- 莫比烏斯反演學習筆記筆記
- HDU 5212 Code (容斥 莫比烏斯反演基礎題)
- SPOJ VLATTICE Visible Lattice Points (莫比烏斯反演基礎題)
- ZOJ 3435 Ideal Puzzle Bobble (莫比烏斯反演基礎題)Idea
- 狄利克雷卷積 & 莫比烏斯反演卷積
- ZOJ 3868 GCD Expectation (容斥+莫比烏斯反演)GC
- HDU 1695 GCD (容斥 + 莫比烏斯反演)GC
- POJ 3904 Sky Code (容斥+莫比烏斯反演)
- 狄利克雷卷積與莫比烏斯反演卷積
- 洛谷 P2257 YY的GCD(莫比烏斯反演)GC
- 演算法隨筆——數論之莫比烏斯反演演算法
- BZOJ 2301 [HAOI2011]Problem b (容斥+莫比烏斯反演+分塊優化 詳解)優化
- Codeforces 548E Mike and Foam (容斥+莫比烏斯反演)
- CSU 1325 A very hard problem (莫比烏斯反演+分塊求和優化)優化
- Codeforces 235E Number Challenge (神定理+莫比烏斯反演)
- FZU 1969 && UVA 11426 GCD Extreme (尤拉函式 或 莫比烏斯反演)GCREM函式
- BZOJ2839/LG10596 集合計數 題解(二項式反演+擴充套件尤拉定理)套件
- HDU 4427 Math Magic【dp+優化+滾動陣列】【好題】優化陣列
- 洛谷 P4829 kry loves 2048——題解
- 隨機不只是 Math.random —— 前端噪聲應用隨機random前端
- React loves you —“洞悉Redux裝的逼”ReactRedux
- CNNIC:社交應用的“錢景”向好CNN
- 好程式設計師web前端教程:Math函式程式設計師Web前端函式
- J2ME寫好的應用程式打包,需要注意哪些問題?
- 應用程式APP原生開發的好處APP
- OI loves Algorithm——字尾陣列Go陣列
- 應用SqlitePCL應該注意的問題SQLite
- 聊聊答題應用題庫的建立
- Math
- HDU5709 : Claris Loves PaintingAI