LUOGU 3455
Description
FGD正在破解一段密碼,他需要回答很多類似的問(wèn)題:對(duì)于給定的整數(shù)和
,有多少正整數(shù)對(duì)
,滿足
,并且
。作為FGD的同學(xué),F(xiàn)GD希望得到你的幫助。
Input Format
第一行一個(gè)正整數(shù),表示詢問(wèn)組數(shù)。
接下來(lái)行,每行
個(gè)正整數(shù)
,含義如題目所示意。
Output Format
對(duì)于每個(gè)詢問(wèn)輸出一行表示答案。
Sample Input
2
4 5 2
6 4 3
Output Format
3
2
Constraints
對(duì)于%的數(shù)據(jù),滿足
。
CCYOS
這是一道莫比烏斯反演的板子題。
- 前置技能
| 符號(hào) | 含義 |
|---|---|
|
|
|
| 質(zhì)數(shù)集合 | |
|
|
|
顯然n和本身不互質(zhì)
|
|
| 莫比烏斯函數(shù),詳見(jiàn)下文 | |
| 狄利克雷卷積單位元 | |
| 對(duì)于任意 |
|
| 對(duì)于任意 |
|
| 命題 |
| 概念 | 含義 |
|---|---|
| 數(shù)論函數(shù) | 定義域?yàn)槿w正整數(shù),值域?yàn)閺?fù)數(shù)域子集的函數(shù)。 |
| 積性函數(shù) | 若 |
| 完全積性函數(shù) | 對(duì)于任意 |
- 莫比烏斯函數(shù)
其中,
表示每一個(gè)質(zhì)因數(shù)的次數(shù)。
一個(gè)重要的性質(zhì)![]()
證明如下:
1)當(dāng)時(shí):顯然
??擅杜e的約數(shù)
只有
,則原式 =
=
=
。
2) 當(dāng)時(shí):顯然此時(shí)
,
。
則約數(shù)
因?yàn)?img class="math-inline" src="https://math.jianshu.com/math?formula=%5Cforall%20k_i%20%3D%201" alt="\forall k_i = 1" mathimg="1">,所以
。不難看出,枚舉
的約數(shù),即枚舉取的質(zhì)因數(shù)的乘積即可。根據(jù)
的定義,有
根據(jù)二項(xiàng)式定理
構(gòu)造可得
即此時(shí)原式恒為0。
3)定義域內(nèi)其他情況:即在第二種情況上添加
,據(jù)定義有
。所以此時(shí)原式恒為0。
證畢。get_mu函數(shù)的寫法
inline void get_mu(int N){
miu[1] = 1;//初始化
for(int i = 2;i <= N;++i){//從2開(kāi)始
if(!vis[i])prime[++cnt] = i,miu[i] = -1;//標(biāo)記質(zhì)數(shù),質(zhì)數(shù)只有兩個(gè)約數(shù)所以質(zhì)數(shù)的miu值一定是-1
for(int j = 1;j <= cnt&&prime[j] * i <= N;++j){
vis[i * prime[j]] = 1;//標(biāo)記合數(shù)
if(!(i % prime[j]))break;//避免標(biāo)記到存在ki >= 2的數(shù)
else miu[i * prime[j]] = -miu[i];//多了一個(gè)質(zhì)因數(shù),(-1)^k要取相反
}
}
for(int i = 1;i <= N;++i)sum[i] = sum[i - 1] + miu[i];//前綴和便于計(jì)算
}
- 狄利克雷卷積
滿足交換率,結(jié)合率,分配律。
兩個(gè)積性函數(shù)的卷積一定是積性函數(shù)。
單位元的是滿足 f * e = f的函數(shù),當(dāng) e = [n = 1]時(shí),這個(gè)條件成立,所以這種定義是滿足條件的定義之一。而且很好記。證明:
證畢
- 歐拉函數(shù)
一個(gè)重要的性質(zhì)
![]()
證明:
咕咕咕。不會(huì)證。推論
1)證明:
證畢
2)
證明:
由5.1.推出狄利克雷卷積滿足結(jié)合律,所以
由4.可得
證畢
- 莫比烏斯反演
當(dāng)必然有
假設(shè)和結(jié)果互換,此仍然為真命題。
證明如下:
構(gòu)造轉(zhuǎn)化假設(shè),有
則轉(zhuǎn)為證明:若則
。
與5.2.證明相類似,由假設(shè)得到由4.得
反之證若則
:
![]()
![]()
證畢
一些常見(jiàn)的推論
1)證明:
由莫比烏斯函數(shù)的性質(zhì)可得代入原式可得
因?yàn)?img class="math-inline" src="https://math.jianshu.com/math?formula=d%20%5Cmid%20gcd(i%2Cj)" alt="d \mid gcd(i,j)" mathimg="1">,所以
,故考慮先枚舉
,再枚舉
,可得
把后面一段廢話化簡(jiǎn)得
證畢
2)
證明:
將原式轉(zhuǎn)化為依照6.1.的證明。
證畢3)
證明:
由5.1可得代入原式中可得
依照6.1.證明。
證畢一般做法
根據(jù)題意列出算式。
列出一個(gè)可以反演的方程。
反復(fù)化簡(jiǎn),向函數(shù)靠攏。
計(jì)算。
小技巧:整除分塊
通過(guò)觀(da)察(biao)發(fā)現(xiàn),在處理的過(guò)程中,會(huì)出現(xiàn)很多相同的結(jié)果,而且這些結(jié)果呈塊狀分布。進(jìn)一步觀(da)察(biao),會(huì)發(fā)現(xiàn)對(duì)于每一個(gè)結(jié)果相同的塊,當(dāng)前位置為
,這個(gè)塊的結(jié)束位置為
。
那么整除分塊的代碼就很好寫了:
for(int l = 1,r;l <= n;l = r + 1){
r = n/(n/l);
一些操作;
}
在GC的幫助下找到了理解這個(gè)問(wèn)題的另一個(gè)思路:LUOGU 1403 感謝?。。?/p>
code
#include<bits/stdc++.h>
using namespace std;
#define mxn 50005
int N,cnt;
int sum[mxn],prime[mxn],vis[mxn],miu[mxn];
inline int read(){
int ret = 0,fl = 1;
char c = getchar();
for(;!isdigit(c)&&c != '-';c = getchar())if(c == '-')fl = 0;
for(;isdigit(c);c = getchar())ret = (ret << 3) + (ret << 1) + c - 48;
return fl ? ret : -ret;
}
inline void get_mu(int N){
miu[1] = 1;
for(int i = 2;i <= N;++i){
if(!vis[i])prime[++cnt] = i,miu[i] = -1;
for(int j = 1;j <= cnt&&prime[j] * i <= N;++j){
vis[i * prime[j]] = 1;
if(!(i % prime[j]))break;
else miu[i * prime[j]] = -miu[i];
}
}
for(int i = 1;i <= N;++i)sum[i] = sum[i - 1] + miu[i];
}
int main(){
N = read();
get_mu(50000);
for(int i = 1;i <= N;++i){
int a,b,k;
long long ans = 0;
a = read();b = read();k = read();
int limit = min(a,b);
for(int l = 1,r;l <= limit;l = r + 1){
r = min(a/(a/l),b/(b/l));
ans += 1ll * (a/(l * k)) * (b/(l * k)) * (sum[r] - sum[l - 1]);
}
printf("%lld\n",ans);
}
return 0;
}
參考文檔