当前位置:网站首页>2022.8.8 Selected Lectures on Good Topics (Number Theory Field)
2022.8.8 Selected Lectures on Good Topics (Number Theory Field)
2022-08-10 21:33:00 【aWty_】
T1 反素数
t a g tag tag:暴力 dfs ???
分析
The first thing we no idea,于是考虑拿出一个数 n n n 对她进行质因数分解:
n = ∏ p i k i n = \prod_{}p_i^{k_i} n=∏piki
再经过一些观察可以发现,如果对于 p i p_i pi 从小到大排序过后,对于一个反素数而言, k i k_i ki Is it does not increase monotonically.
这个其实挺好证明的,因为如果 k i k_i ki The monotone increasing( k i > k i − 1 k_i > k_{i - 1} ki>ki−1),那么我们交换 k i k_i ki 和 k i − 1 k_{i - 1} ki−1,那么我们就得到了一个因数个数与原数相同的且值比原数小的数 n ′ n' n′,这样一来 n n n 就不满足反素数的定义了,证毕.
于是我们可以得出一个性质,那么就是 1 e 9 1e9 1e9 The prime number must be led by former 10 10 10 个质数组成(这个很显然吧).那么我们就可以愉快的 d f s dfs dfs 了,就是尝试确定每一个质数的指数,同时记录一个约数个数就好了.
代码
#include<bits/stdc++.h>
using namespace std;
#define in
int n = 0;
int mx = 0;
int ans = 0;
int p[11] = {
0, 2, 3, 5, 7, 11, 13, 17, 19, 23, 19 };
void dfs(int m, int ind, int num, int k){
// 当前数 The current prime number The few number 当前指数
if(num > mx or (num == mx and m < ans)) ans = m, mx = num;
int j = 0, temp, i = m;
while(j < k){
j++;
if(n / i < p[ind]) break;
temp = num * (j + 1), i = i * p[ind];
if(i <= n) dfs(i, ind + 1, temp, j);
}
}
signed main(){
cin >> n;
dfs(1, 1, 1, 30);
cout << ans << '\n';
return 0;
}
T2 余数求和
传送门:[CQOI2007]余数求和
t a g tag tag:Modular arithmetic???
分析
Direct push formula:
∑ i = 1 n k m o d i = ∑ i = 1 n k − i × ⌊ k i ⌋ = n k − ∑ i = 1 n i × ⌊ k i ⌋ \begin{aligned} & \sum_{i = 1}^n k \mod i \\ = & \sum_{i = 1}^n k - i \times \left\lfloor \frac ki \right\rfloor \\ = & nk - \sum_{i = 1}^n i \times \left\lfloor \frac ki \right\rfloor \end{aligned} ==i=1∑nkmodii=1∑nk−i×⌊ik⌋nk−i=1∑ni×⌊ik⌋
turn addition, subtraction, multiplication, and divisionAnd then we found the back那一坨: ∑ i = 1 n i × ⌊ k i ⌋ \sum\limits_{i = 1}^n i \times \lfloor \frac ki \rfloor i=1∑ni×⌊ik⌋ 可以整除分块,然后就可以 O ( n ) O(\sqrt n) O(n) 做完了.
代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
int ans = 0;
int n = 0; int k = 0;
signed main(){
cin >> n >> k;
ans += n * k;
for(int l = 1, r; l <= n; l = r + 1){
if(k / l != 0) r = min(n, k / (k / l));
else r = n;
ans -= (k / l) * (l + r) * (r - l + 1) / 2;
}
cout << ans << '\n';
return 0;
}
T3 yy 的 gcd
传送门:yy 的 gcd
t a g tag tag:莫比乌斯反演???
分析
Get the answer is( p r i m e prime prime Said prime set):
a n s = ∑ i = 1 n ∑ j = 1 m [ gcd ( i , j ) ∈ p r i m e ] ans = \sum_{i = 1}^n \sum_{j = 1}^m [\gcd(i, j) \in prime] ans=i=1∑nj=1∑m[gcd(i,j)∈prime]
我们把他化简成能莫反的形式:
a n s = ∑ k ∈ p r i m e ∑ i = 1 n ∑ j = 1 m [ gcd ( i , j ) = k ] = ∑ k = ∈ p r i m e ∑ i = 1 ⌊ n k ⌋ ∑ j = 1 ⌊ m k ⌋ [ gcd ( i , j ) = 1 ] \begin{aligned} ans = & \sum_{k \in prime} \sum_{i = 1}^n \sum_{j = 1}^m [\gcd(i, j) = k] \\ = &\sum_{k = \in prime} \sum_{i = 1}^{\lfloor \frac nk \rfloor} \sum_{j = 1}^{\lfloor \frac mk \rfloor} [\gcd(i, j) = 1] \\ \end{aligned} ans==k∈prime∑i=1∑nj=1∑m[gcd(i,j)=k]k=∈prime∑i=1∑⌊kn⌋j=1∑⌊km⌋[gcd(i,j)=1]
然后就是喜闻乐见的莫反环节了:
= ∑ k = ∈ p r i m e ∑ i = 1 ⌊ n k ⌋ ∑ j = 1 ⌊ m k ⌋ ∑ d ∣ gcd ( i , j ) μ ( d ) \begin{aligned} = & \sum_{k = \in prime} \sum_{i = 1}^{\lfloor \frac nk \rfloor} \sum_{j = 1}^{\lfloor \frac mk \rfloor} \sum_{d | \gcd(i, j)} \mu(d) \\ \end{aligned} =k=∈prime∑i=1∑⌊kn⌋j=1∑⌊km⌋d∣gcd(i,j)∑μ(d)
再然后就是一些小 t r i c k trick trick 了:
= ∑ k = ∈ p r i m e ∑ d = 1 ⌊ n k ⌋ ∑ i = 1 ⌊ n k ⌋ ∑ j = 1 ⌊ m k ⌋ [ d ∣ i ∧ d ∣ j ] μ ( d ) = ∑ k = ∈ p r i m e ∑ d = 1 ⌊ n k ⌋ ⌊ n k d ⌋ ⌊ m k d ⌋ μ ( d ) \begin{aligned} = & \sum_{k = \in prime} \sum_{d = 1}^{\lfloor \frac nk \rfloor} \sum_{i = 1}^{\lfloor \frac nk \rfloor} \sum_{j = 1}^{\lfloor \frac mk \rfloor} [d | i \land d | j]\mu(d) \\ = & \sum_{k = \in prime} \sum_{d = 1}^{\lfloor \frac nk \rfloor} \left\lfloor \frac{n}{kd} \right\rfloor \left\lfloor \frac{m}{kd} \right\rfloor \mu(d) \end{aligned} ==k=∈prime∑d=1∑⌊kn⌋i=1∑⌊kn⌋j=1∑⌊km⌋[d∣i∧d∣j]μ(d)k=∈prime∑d=1∑⌊kn⌋⌊kdn⌋⌊kdm⌋μ(d)
然后我们发现好像式子已经化到最简了,但是我们算一下复杂度就会发现我们愉快的 T T T 掉了.所以说这里又有一个常用的降复杂度的 t r i c k trick trick:令 T = k d T = kd T=kd,然后:
a n s = ∑ k = ∈ p r i m e ∑ d = 1 ⌊ n k ⌋ ⌊ n T ⌋ ⌊ m T ⌋ μ ( d ) \begin{aligned} ans = & \sum_{k = \in prime} \sum_{d = 1}^{\lfloor \frac nk \rfloor} \left\lfloor \frac{n}{T} \right\rfloor \left\lfloor \frac{m}{T} \right\rfloor \mu(d) \end{aligned} ans=k=∈prime∑d=1∑⌊kn⌋⌊Tn⌋⌊Tm⌋μ(d)
Then consider the enumeration T T T,并把 T T T The mentioned ahead:
= ∑ T = 1 n ⌊ n T ⌋ ⌊ m T ⌋ ∑ k ∣ T ∧ k ∈ p r i m e μ ( T k ) = \sum_{T = 1}^n \left\lfloor \frac{n}{T} \right\rfloor \left\lfloor \frac{m}{T} \right\rfloor \sum_{k | T \land k \in prime} \mu(\frac Tk) =T=1∑n⌊Tn⌋⌊Tm⌋k∣T∧k∈prime∑μ(kT)
turn addition, subtraction, multiplication, and divisionAnd then we found the back ∑ k ∣ T ∧ k ∈ p r i m e μ ( T k ) \sum\limits_{k | T \land k \in prime} \mu(\frac Tk) k∣T∧k∈prime∑μ(kT) 可以预处理,具体来说对于每一个质数 k k k 枚举 k k k 的倍数 T T T,And then put her value, μ ( T k ) \mu(\frac Tk) μ(kT) 就好了.
#include<bits/stdc++.h>
using namespace std;
#define in read()
#define MAXN 10000010
inline int read(){
int x = 0; char c = getchar();
while(c < '0' or c > '9') c = getchar();
while('0' <= c and c <= '9'){
x = x * 10 + c - '0'; c = getchar();
}
return x;
}
int Q = 0;
int n = 0; int m = 0;
int cnt = 0;
int flag[MAXN] = {
0 };
int mu[MAXN] = {
0 };
int prime[MAXN] = {
0 };
long long f[MAXN] = {
0 };
long long sum[MAXN] = {
0 };
void sieve(){
mu[1] = 1;
for(int i = 2; i <= MAXN; i++){
if(!flag[i]) prime[++cnt] = i, mu[i] = -1;
for(int j = 1; j <= cnt and i * prime[j] <= MAXN; j++){
flag[i * prime[j]] = 1;
if(i % prime[j] == 0) break;
mu[i * prime[j]] = -mu[i];
}
}
for (int i = 1; i <= cnt; i++)
for (int j = 1; prime[i] * j <= MAXN; j++)
f[j * prime[i]] += mu[j];
for (int i = 1; i <= MAXN; i++)
sum[i] = sum[i - 1] + f[i];
}
long long solve(int a,int b) {
long long ans = 0;
if (a > b) swap(a, b);
for (int l = 1, r; l <= a; l = r + 1) {
r = min(a / (a / l), b / (b / l));
ans += (sum[r] - sum[l - 1]) * (a / l) * (b / l);
}
return ans;
}
signed main(){
Q = in;
sieve();
while(Q--){
n = in; m = in;
if(n > m) swap(n, m);
cout << solve(n, m) << '\n';
}
return 0;
}
T4 dkw 的 lcm
传送门:dkw 的 lcm
t a g tag tag:把数看成希尔伯特空间???
分析
直接把式子告诉你了:
a n s = ∏ i 1 = 1 n ∏ i 2 = 1 n ⋯ ∏ i k = 1 n φ ( l c m ( i 1 , i 2 , i 3 , ⋯ , i k ) ) m o d ( 1 e 9 + 7 ) ans = \prod_{i_1 = 1}^n\prod_{i_2 = 1}^n \cdots \prod_{i_k = 1}^n \varphi(lcm(i_1, i_2, i_3, \cdots, i_k)) \mod (1e9+7) ans=i1=1∏ni2=1∏n⋯ik=1∏nφ(lcm(i1,i2,i3,⋯,ik))mod(1e9+7)
首先 t a g tag tag 里面的希尔伯特空间是个啥?简单来说无限维的空间就可以理解成一个希尔伯特空间.那么这个空间是怎么定义的呢?对于一个数 n n n Prime factors decomposition to him,然后希尔伯特空间中的维度就代表质因子的次数.
So each Numbers n n n 就能被看成希尔伯特空间中的一个向量.
这样做的好处是什么呢?因为这样一来我们复杂的 l c m lcm lcm 操作就变成了对于很多的无限维向量,在每一个维度上取一个最大值,得到的新的数就是这些 n n n 维向量所代表的数的 l c m lcm lcm.
根据这个思想,我们就很容易想到把质因子单独拎出来考虑贡献(而且 φ ( n ) \varphi(n) φ(n) Or multiplicative function).所以我们直接考虑每一个 φ ( p t ) \varphi(p^t) φ(pt) 在最终的答案中出现的次数.然后这个就考虑容斥一下嘛,定义一下三个集合:
- A = { x ∣ p t ∤ x , x ≤ n } A = \{ x \mid p^t \nmid x, x \leq n \} A={ x∣pt∤x,x≤n} 也就是 1 ∼ n 1 \sim n 1∼n 中不是 p t p^t pt A collection of multiple of the number of
- B = { x ∣ p t ∣ x , p t + 1 ∤ x , x ≤ n } B = \{ x \mid p^t \mid x, p^{t + 1} \nmid x, x \leq n \} B={ x∣pt∣x,pt+1∤x,x≤n} 也就是 1 ∼ n 1 \sim n 1∼n 中刚好是 p t p^t pt A collection of multiple
- C = { x ∣ p t + 1 ∣ x , x ≤ n } C = \{ x \mid p^{t + 1} \mid x, x \leq n \} C={ x∣pt+1∣x,x≤n} 也就是超过了 p t p^t pt
那么 φ ( p t ) \varphi(p^t) φ(pt) 出现的次数就是:
( ∣ A ∣ + ∣ B ∣ ) k − ∣ A ∣ k (|A| + |B|)^k - |A|^k (∣A∣+∣B∣)k−∣A∣k
然后我们考虑 ∣ A ∣ + ∣ B ∣ |A| + |B| ∣A∣+∣B∣ 等于多少,Obviously is equal to the first n − ∣ C ∣ n - |C| n−∣C∣,那么我们考虑 ∣ C ∣ |C| ∣C∣ 是多少.这个也就很显然了嘛,因为 C C C 中只有 p t + 1 p^{t + 1} pt+1 的倍数,所以个数就是 ⌊ n p t + 1 ⌋ \left\lfloor\frac n{p^{t + 1}}\right\rfloor ⌊pt+1n⌋.
那么同理,我们就可以得到:
∣ A ∣ = n − ⌊ n p t ⌋ ∣ B ∣ = ⌊ n p t ⌋ − ⌊ n p t + 1 ⌋ ∣ C ∣ = ⌊ n p t + 1 ⌋ \begin{aligned} |A| = & n - \left\lfloor \frac n{p^t} \right\rfloor \\ |B| = & \left\lfloor \frac n{p^t} \right\rfloor - \left\lfloor\frac n{p^{t + 1}}\right\rfloor \\ |C| = & \left\lfloor\frac n{p^{t + 1}}\right\rfloor \end{aligned} ∣A∣=∣B∣=∣C∣=n−⌊ptn⌋⌊ptn⌋−⌊pt+1n⌋⌊pt+1n⌋
然后这里有一个细节,就是因为 ( ∣ A ∣ + ∣ B ∣ ) k − ∣ A ∣ k (|A| + |B|)^k - |A|^k (∣A∣+∣B∣)k−∣A∣k 这个东西是写在指数上的,所以根据扩展欧拉定理,When operation is to 1 e 9 + 6 1e9 + 6 1e9+6 Modulus instead of 1 e 9 + 7 1e9 + 7 1e9+7 取模.
于是我们枚举 p p p,然后枚举 t t t,然后计算 ( n − ⌊ n p t + 1 ⌋ ) k − ( n − ⌊ n p t ⌋ ) k \left(n - \left\lfloor\frac n{p^{t + 1}}\right\rfloor\right)^k - \left(n - \left\lfloor \frac n{p^t} \right\rfloor\right)^k (n−⌊pt+1n⌋)k−(n−⌊ptn⌋)k,The fast power O ( log k ) O(\log k) O(logk) 搞定.然后前面枚举的复杂度就是质数的小于等于 n n n 的 若干次方的个数也就是 O ( n ln n ) O(\frac n{\ln n}) O(lnnn)(Prime number is O ( n ln n ) O(\frac n{\ln n}) O(lnnn)).于是总的复杂度就是: O ( n ln n log k ) O(\frac n{\ln n}\log k) O(lnnnlogk) 的.
T5 数论
数论之神
lcm sum h
lcm sum
屠龙勇士
能量采集 noi 2010
边栏推荐
- RTL8721DM 双频WIFI + 蓝牙5.0 物联网(IoT)应用
- Object.assign用法 以及 与$.extend的区别
- 如何保护 LDAP 目录服务中的用户安全?
- D. Game With Array
- GAN CFOP
- LeetCode-36-Binary search tree and doubly linked list
- Live Classroom System 09--Tencent Cloud VOD Management Module (1)
- 直播课堂系统08-腾讯云对象存储和课程分类管理
- DELETE:删除操作语法&使用例——《mysql 从入门到内卷再到入土》
- HGAME 2022 Week2 writeup by pankas
猜你喜欢

玩转doxygen 之RT-THREAD

华为路由器旁挂引流实验(使用流策略)

The use of TortoiseSVN little turtle

JS中的filter、map、reduce

Exploration and practice of the "zero trust" protection and data security governance system of the ransomware virus of Meichuang Technology

Future与CompletableFuture

HighTec快捷键(Keys)设置位置

【Maui正式版】创建可跨平台的Maui程序,以及有关依赖注入、MVVM双向绑定的实现和演示

找的笔试题的复盘(一)

【PCBA solution】Electronic grip strength tester solution she'ji
随机推荐
[Golang]从0到1写一个web服务(上)
Go程序员进化史
《mysql 从入门到内卷再到入土》——Mysql基础 学习笔记目录
JVM classic fifty questions, now the interview is stable
GAN CFOP
2021 CybricsCTF
labelme-5.0.1版本编辑多边形闪退
【Maui正式版】创建可跨平台的Maui程序,以及有关依赖注入、MVVM双向绑定的实现和演示
着力提升制造业核心竞争力,仪器仪表产业迎高质量发展
用示波器揭示以太网传输机制
数字化转型:如何引导创新领导者
Huawei router clock near the drainage experiment (using stream strategy)
我的世界整合包 云服务器搭建方法(ECS)
Future-oriented IT infrastructure management architecture - Unified IaaS
优化是一种习惯●出发点是'站在靠近临界'的地方
直播课堂系统09--腾讯云点播管理模块(一)
Getting started with kuberentes Auditing
B. Same Parity Summands
Live Classroom System 08-Tencent Cloud Object Storage and Course Classification Management
2021 GKCTF X DASCTF应急挑战杯