算法中的數學:歐拉函數

1.相關定義

互質:a與b的最大公約數為1

歐拉函數:在1~n中,與n互質的數的個數就是歐拉函數的值

eg:

n=1時,歐拉函數的值為1,因為1和1是互質的

n=2是,值為2,因為1和2都是互質的


積性函數:f(1)= 1且f(xy) = f(x)f(y),其中x與y互質

2.歐拉函數

性質:
1.若p為質數,則:φ(p) = p-1

解析:

因為p是質數,所以在1~p中與p有除了1以外的公約數的只有p本身,總共的數的個數為p,所以與p互質的數就是p-1個,即φ(p) = p-1
2.若p為質數,則:φ(p^k) = (p-1)p^(k-1)

解析:
對p^k進行分解質因數:p^k = p*p*p*p...*p(共k個)

我們發現p^k只有p本身,而p是質數,不能由其他數組合而成,所以p^k只能與p的倍數有除了1以外的公約數,而我們以每一個倍數的p為一個周期看待,每個周期內有p-1個與p^k

互質的數

3.歐拉函數屬于積性函數

即φ(xy) = φ(x)φ(y)

3.試除法求單個數歐拉函數?

公式解釋:單個數n的歐拉函數就是n乘上(pi-1)/pi的連乘

公式推導:

1.對n分解質因數

2.由于歐拉函數是積性函數,所以我們可以直接拆分開

3.由于pi是質數,根據歐拉函數的性質(若p為質數,則:φ(p^k) = (p-1)p^(k-1)),得到結果式子

4.我們將pi^(αi-1)中的pi^(-1)分離出去給到(pi-1),于是就得到了(pi-1)/pi

5.根據pi的連乘是n分解質因數的得到的,所以pi的連乘換成n,得證

代碼實現:
?

int phi(int n)
{int answer = n;for (int i = 2; i <= n / i; i++){if (n % i == 0){answer = answer / i * (i - 1);//先除后乘防止溢出while (n % i == 0) n /= i;}}if (n > 1) answer = answer / n * (n - 1);return answer;
}

4.歐拉篩打表歐拉函數

我們可以在進行線性篩的時候順便計算記錄下對應數據的歐拉函數

線性篩代碼如下:
?

typedef long long ll;
const int N = 1e9;
bool f[N];
int a[N];
int count;
void get_prime(int n)
{for(ll i = 2; i <= n; i++){
//沒有被標記為true,說明是質數if(f[i] == false) {a[++count] = i;}
//進行線性篩for(int j = 1; i*a[j] <= n; j++){f[i*a[j]] = true;if(i % a[j] == 0) break;{          }
}

若數據是質數:根據歐拉函數的性質,歐拉函數的值就是該數-1

若數據不是質數:

(1)i%a[j] != 0:且a[j]是質數,所以i與a[j]互質,此時根據歐拉函數的性質

(φ(xy) = φ(x)φ(y))可知,φ(x) = φ(i)*φ(a[j])

(2)i%a[j] == 0: φ(x) = φ(i)*a[j]

證明如下:

打表代碼:
?

typedef long long ll;
const int N = 1e9;
bool f[N];
int a[N];
int count;
int phi[N];
void get_prime(int n)
{phi[1] = 1;for(ll i = 2; i <= n; i++){
//沒有被標記為true,說明是質數if(f[i] == false) {a[++count] = i;phi[i] = i - 1;}
//進行線性篩for(int j = 1; i*a[j] <= n; j++){int x = i * a[j];f[i*a[j]] = true;if(i % a[j] == 0) {phi[x] = a[j] * phi[i];break;}else{phi[x] = phi[i] * (p[j]-1);}}          }
}

5.例題講解

?

審題:

本題需要我們找到從坐標原點出發可以直接看到的坐標個數

思路:
方法一:分析+歐拉函數

我們建立坐標徐后可以清楚發現,只要點在同一條從原點出發的直線路徑上,就只有第一個點可以被直接看到,其他的點都會被遮住。

而被遮住的點可以通過除以橫縱坐標的最大公約數變成第一個可以被看見的點,由于這個特性,我們發現最大公約數不為1的橫縱坐標的點都會被遮住(因為他們都可以轉換成直線上第一個被看見的點)

故可以被看見的點就是橫縱坐標互質的點,接下來我們分析如何求

首先我們分析第五列的點(先不看在坐標軸上的點),我們發現橫縱坐標互質的點的個數(可以被看到的數)其實就是當前橫坐標的歐拉函數。

故我們可以直接將1~n-1的數的歐拉函數累加起來,然后就得到了下半邊的可看到點位數,再根據對稱輪換,我們對結果乘2可以得到上下兩邊的可看到點數。但是此時我們的(1,1)被計算了兩次(要減1),而坐標軸上的(1,0)和(0,1)兩點還沒加上(要加2),綜合起來我們就要在當前結果的基礎上加一.

解題:

#include<iostream>
using namespace std;
typedef long long ll;
const int N = 4e4 + 10;
int n;
//線性篩所需變量
bool st[N];
ll p[N],cnt;
ll phi[N];//歐拉函數
void get_phi()
{phi[1] = 1;for (ll i = 2; i <= n; i++){if (!st[i]){p[++cnt] = i;phi[i] = i - 1;}for (ll j = 1; i * p[j] <= n; j++){st[i * p[j]] = true;ll x = i * p[j];if (i % p[j] == 0){phi[x] = phi[i] * p[j];break;}else//i 與p[j]互質{phi[x] = phi[i] * (p[j] - 1);}}}
}
int main()
{cin >> n;get_phi();ll sum = 0;for (int i = 1; i < n; i++){sum += phi[i];}if (n == 1) cout << 0 << endl;elsecout << sum * 2 + 1 << endl;return 0;
}

其中計算歐拉函數就是使用線性篩來完成。

注意:累加的時候不要加到i==n的情況,因為我們的坐標是從0開始的,所以訪問到i==n其實就是越界訪問

P2158 [SDOI2008] 儀仗隊 - 洛谷

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/81971.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/81971.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/81971.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

BaseDao指南

1. BaseDao類 import java.sql.*;/*** 通用的工具類 ,負責連接數據&#xff0c; 執行增刪改查的通用方法*/ public class BaseDao {private Connection connection;private PreparedStatement pstm;private ResultSet rs;/*** 建立數據庫連接** return*/public Boolean getCon…

SpringBoot JAR 啟動原理

文章目錄 版本概述JAR 包結構MANIFEST.MF 描述文件JarLauncherArchive 接口launch 方法Handlers.register() 方法getClassPathUrls 方法createClassLoader 方法 時序圖參考 版本 Java 17SpringBoot 3.2.4 概述 JAR 啟動原理可以簡單理解為“java -jar的啟動原理” SpringBo…

YOLO11解決方案之速度估算探索

概述 Ultralytics提供了一系列的解決方案&#xff0c;利用YOLO11解決現實世界的問題&#xff0c;包括物體計數、模糊處理、熱力圖、安防系統、速度估計、物體追蹤等多個方面的應用。 YOLO速度估算結合物體檢測和跟蹤技術&#xff0c;使用YOLO11 模型檢測每幀中的物體&#xf…

初識C++:模版

本篇博客主要講解C模版的相關內容。 目錄 1.泛型編程 2.函數模板 2.1 函數模版概念 2.2 函數模版格式 2.3 函數模版的原理 2.4 函數模版的實例化 1.隱式實例化&#xff1a;讓編譯器根據實參推演模板參數的實際類型 2. 顯式實例化&#xff1a;在函數名后的<>中指定模…

人工智能100問?第27問:神經網絡與貝葉斯網絡的關系?

神經網絡與貝葉斯網絡是兩種互補的智能模型:神經網絡通過多層非線性變換從數據中學習復雜模式,擅長大規模特征提取和預測,而貝葉斯網絡基于概率推理建模變量間的條件依賴關系,擅長處理不確定性和因果推斷。兩者的融合(如貝葉斯神經網絡)結合了深度學習的表征能力與概率建…

【node.js】入門基礎

個人主頁&#xff1a;Guiat 歸屬專欄&#xff1a;node.js 文章目錄 1. Node.js簡介1.1 Node.js的核心特點1.2 Node.js適用場景 2. 第一個Node.js程序2.1 創建并運行Hello World2.2 創建簡單的HTTP服務器 3. Node.js核心概念3.1 模塊系統3.1.1 創建和導出模塊3.1.2 導入和使用模…

百度飛槳PaddleOCR 3.0開源發布 OCR精度躍升13%

百度飛槳 PaddleOCR 3.0 開源發布 2025 年 5 月 20 日&#xff0c;百度飛槳團隊正式發布了 PaddleOCR 3.0 版本&#xff0c;并將其開源。這一新版本在文字識別精度、多語種支持、手寫體識別以及高精度文檔解析等方面取得了顯著進展&#xff0c;進一步提升了 PaddleOCR 在 OCR …

Android 14 Binderized HAL開發實戰指南(AIDL版)

Android 14 Binderized HAL開發實戰指南&#xff08;AIDL版&#xff09; 環境要求 Android 14源碼編譯環境AOSP android-14.0.0_r7分支Soong build系統Java 17 & NDK r25c 項目結構 hardware/interfaces/myservice/ ├── 1.0 │ ├── IMyHalService.aidl # AID…

第九天的嘗試

目錄 一、每日一言 二、練習題 三、效果展示 四、下次題目 五、總結 一、每日一言 創造美好的代價是努力&#xff0c;失望以及毅力&#xff0c;首先是痛苦&#xff0c;然后才是歡樂。 時間是快的&#xff0c;看怎么利用&#xff0c;安排好一切事情&#xff0c;才能從容面對…

交安安全員:交通工程安全領域的關鍵角色

在交通工程這個龐大而復雜的領域中&#xff0c;交安安全員扮演著舉足輕重的角色&#xff0c;他們是安全的捍衛者&#xff0c;是交通工程順利推進的重要保障。? 交安安全員&#xff0c;專門從事公路水運工程施工企業安全生產管理工作。他們的專業身份由交通運輸部門頒發的交安…

實驗-設計一個應用系統(計算機組成原理)

目錄 一. 實驗內容 二. 實驗步驟 &#xff08;1&#xff09;七段數碼管顯示模塊 &#xff08;2&#xff09;指令模塊 &#xff08;3&#xff09;控制模塊 &#xff08;4&#xff09;ALU模塊 &#xff08;5&#xff09;CPU模塊 三. 實現效果 四. 實驗環境 五. 實驗小結…

【博客系統】博客系統第四彈:令牌技術

令牌機制 為什么不能使用 Session 實現登錄功能&#xff1f; 傳統思路&#xff1a; 登錄頁面把用戶名密碼提交給服務器。服務器端驗證用戶名密碼是否正確&#xff0c;并返回校驗結果給前端。如果密碼正確&#xff0c;則在服務器端創建 Session。通過 Cookie 把 sessionId 返回…

【瑞數3代】藥監評審中心逆向分析 | 后綴MmEwMD參數

1.目標 目標網址&#xff1a;https://www.cde.org.cn/main/news/listpage/545cf855a50574699b46b26bcb165f32 import requestscookies {FSSBBIl1UgzbN7N80S: 8sYeMWaC_IHoNl8Ckfx2y9MLiueMCkPr2V3MIoZkrMPUfzMMaXKzAoxpNPvyw4lt,Path: /,FSSBBIl1UgzbN7N80T: 3js3ygV.St6BvO20…

【漫話機器學習系列】274.基尼指數(Gini Index)

決策樹中的基尼指數&#xff08;Gini Index&#xff09;詳解 —— 從公式理解到實際應用 在構建決策樹模型時&#xff0c;一個核心問題是&#xff1a;如何選擇最優的特征來進行節點劃分&#xff1f; 這就涉及到了“劃分準則”的問題。常見的準則有信息增益、信息增益率以及本文…

R語言學習--Day07--T分布與T檢驗

昨天我們介紹了R中用于對數據進行分類的聚類分析的方法&#xff0c;接下來我們來看T分布。 T分布 T分布適用于幫我們估計整組數據&#xff08;較小的數據量&#xff0c;一般小于30&#xff09;的真實值在哪一個區間&#xff0c;具體是計算置信區間&#xff08;一般為95%&#…

數據結構與算法-線性表-雙向鏈表(Double Linked List)

1 線性表 1.4 雙向鏈表&#xff08;Double Linked List&#xff09; 雙向鏈表的結點中有兩個指針域&#xff0c;一個指向直接后繼&#xff0c;另一個指向直接前驅&#xff0c;主要是為了解決前向查找的問題。 雙向鏈表結構&#xff1a; 書籍和視頻教程都只講解了插入和刪除的…

甘特圖實例 dhtmlxGantt.js

本文介紹了如何使用dhtmlxGantt庫創建一個基礎的甘特圖示例&#xff0c;并對其進行漢化和自定義配置。首先&#xff0c;通過引入dhtmlxgantt.css和dhtmlxgantt.js文件初始化甘特圖。接著&#xff0c;通過設置gantt.i18n.setLocale("cn")實現核心文本的漢化&#xff0…

C++23 新增扁平化關聯容器詳解

文章目錄 一、引言已有關聯容器回顧新容器的引入原因 二、std::flat_set定義與特性代碼示例適用場景 三、std::flat_multiset定義與特性代碼示例適用場景 四、std::flat_map定義與特性代碼示例適用場景 五、std::flat_multimap定義與特性代碼示例適用場景 六、與其他容器的比較…

使用zap,對web應用/API接口 做安全檢測

https://www.zaproxy.org/getting-started/ 檢測方法 docker pull ghcr.io/zaproxy/zaproxy:stable# 執行baseline測試 docker run -t ghcr.io/zaproxy/zaproxy:stable zap-baseline.py \ -t https://baseline.yeshen.org# 執行api測試 docker run -t ghcr.io/zaproxy/zaproxy…

Qt—模態與非模態對話框

Qt—模態與非模態對話框 核心概念 ?模態對話框??&#xff1a;強制用戶優先處理當前窗口&#xff0c;阻塞指定范圍的用戶交互。?非模態對話框??&#xff1a;允許用戶自由切換窗口&#xff0c;無交互限制。 一、模態對話框類型與行為 1. 應用級模態&#xff08;Applica…