【數論分塊】數論分塊算法模板及真題

1.數論分塊的含義

數論分塊算法,就是枚舉出使得取整函數發生變化的地方。
例如,對表達式 ? n i ? \lfloor \frac{n}{i} \rfloor ?in??使用數論分塊算法,就可以在 O ( n ) O(\sqrt n) O(n ?)的時間復雜度下枚舉所有滿足 ? n i ? 1 ? + 1 = ? n i ? \lfloor \frac{n}{i-1}\rfloor+1 = \lfloor \frac{n}{i} \rfloor ?i?1n??+1=?in??的 i 。

2.算法模板

long long r;
for(int l = 1; l <= n; l = r + 1)
{r = k/(k/l)/*your code*/
}

變量 l 就是取整函數發生變化的位置,即滿足 ? n l ? 1 ? + 1 = ? n l ? \lfloor \frac{n}{l-1}\rfloor+1 = \lfloor \frac{n}{l} \rfloor ?l?1n??+1=?ln??(l = 1除外)的位置,變量 r 就是滿足 ? n x ? = ? n l ? \lfloor \frac{n}{x}\rfloor = \lfloor \frac{n}{l} \rfloor ?xn??=?ln??的所有x 中最大的一個。
直觀上,該過程時間復雜度小于 O ( n ) O(n) O(n),因為每次往后跳的長度大于1,
該算法的實際復雜度為 O ( n ) O(\sqrt n) O(n ?)
正確性證明和時間復雜度證明,詳見此處。寫題不需要證明。

3.算法的優化點

將所有 ? n i ? \lfloor \frac{n}{i} \rfloor ?in??結果一樣的 i 一并取出,使得時間復雜度降為 O ( n ) O(\sqrt n) O(n ?)
涉及取整的地方均可能用到此算法,包括但不限于,整除(練習題1)、最大公因數(練習題3)、最小公倍數(練習題2)、取模(本文例題)。

4.例題

P2261 [CQOI2007] 余數求和

題目描述

給出正整數 n n n k k k,請計算

G ( n , k ) = ∑ i = 1 n k m o d i G(n, k) = \sum_{i = 1}^n k \bmod i G(n,k)=i=1n?kmodi

其中 k m o d i k\bmod i kmodi 表示 k k k 除以 i i i 的余數。

輸入格式

輸入只有一行兩個整數,分別表示 n n n k k k

輸出格式

輸出一行一個整數表示答案。

輸入輸出樣例 #1

輸入 #1

10 5

輸出 #1

29

說明/提示

樣例 1 解釋

G ( 10 , 5 ) = 0 + 1 + 2 + 1 + 0 + 5 + 5 + 5 + 5 + 5 = 29 G(10, 5)=0+1+2+1+0+5+5+5+5+5=29 G(10,5)=0+1+2+1+0+5+5+5+5+5=29

數據規模與約定
  • 對于 30 % 30\% 30% 的數據,保證 n , k ≤ 1 0 3 n , k \leq 10^3 n,k103
  • 對于 60 % 60\% 60% 的數據,保證 n , k ≤ 1 0 6 n, k \leq 10^6 n,k106
  • 對于 100 % 100\% 100% 的數據,保證 1 ≤ n , k ≤ 1 0 9 1 \leq n, k \leq 10^9 1n,k109

解題思路

  • a % b = a ? ? a b ? ? b a \% b =a- \left \lfloor \frac{a}{b} \right \rfloor *b a%b=a??ba???b
  • 求和時,前半部分和后半部分,分開處理。
  • 數列 a i = i ? ? x i ? a_i =i * \left \lfloor \frac{x}{i} \right \rfloor ai?=i??ix??,在 ? x i ? \left \lfloor \frac{x}{i} \right \rfloor ?ix??為不變值的時候,是等差數列。

AC代碼

#include<bits/stdc++.h>
#define int long longusing namespace std;
typedef pair<int,int> PII;
const int mod = 998244353;
void solve()
{int n,k;cin >> n >> k;long long ans = 0;ans += n*k;int r;for(int i = 1; i <= n; i = r + 1){if(k/i == 0) break;r = min(k/(k/i),n);ans -= (r-i+1)*(i+r)/2 *(k/i);}cout << ans << '\n';
}signed main()
{ios::sync_with_stdio(false);cin.tie(0);int t = 1;//cin >> t;while(t --){solve();}
}

練習題

  • 【AtCoder Regular Contest 150B】
  • 【2025CCPC北京市賽】
  • 【2021ICPC陜西省賽】

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

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

相關文章

SpringBoot 常用注解通俗解釋

SpringBoot 常用注解通俗解釋 一、啟動類相關 1. SpringBootApplication ? 作用&#xff1a;這是SpringBoot項目的"總開關"&#xff0c;放在主類上 ? 通俗理解&#xff1a;相當于對電腦說&#xff1a;"開機&#xff01;我要用SpringBoot了&#xff01;…

棧應用:括號匹配

1&#xff1a;普通字符串括號匹配 #include <iostream> #include <stack> #include <string> using namespace std; bool mat(char,char); int if_match(string); int main(){string a;cin>>a;cout<<if_match(a)<<endl;return 0; } bool m…

某東h5st_5.1(補環境)

JS逆向實戰——某東h5st_5.1&#xff08;補環境&#xff09; 聲明網站流程分析結果展示總結 聲明 本文章中所有內容僅供學習交流&#xff0c;抓包內容、敏感網址、數據接口均已做脫敏處理&#xff0c;嚴禁用于商業用途和非法用途&#xff0c;否則由此產生的一切后果均與作者無…

新增Webhook通知功能,文檔目錄樹展示性能優化,zyplayer-doc 2.5.1 發布啦!

zyplayer-doc是一款適合企業和個人使用的WIKI知識庫管理工具&#xff0c;支持在線編輯富文本、Markdown、表格、Office文檔、API接口、思維導圖、Drawio以及任意的文本文件&#xff0c;支持基于知識庫的AI問答&#xff0c;專為私有化部署而設計&#xff0c;最大程度上保證企業或…

macOS安全隱私最佳實踐分析

1. 引言 隨著數字世界的不斷擴展&#xff0c;個人和組織面臨的安全與隱私威脅也日益增加。作為專業的安全合規與隱私保護研究團隊&#xff0c;Kaamel 對 macOS 系統的安全隱私現狀進行了全面分析&#xff0c;并提出了一系列最佳實踐建議&#xff0c;旨在幫助用戶更好地保護自己…

架構設計之異地多活與單元化(Set化)

公司的業務到達一定規模后,往往會考慮做多數據中心。一方面是面臨業務增長帶來的挑戰,單個數據中心變得難以支撐;另一方面出于對業務容災的考量,也可能在多個城市建立數據中心達到容災目的。單元化(Set化)是作為異地多活的一個解決方案。 一、什么是異地多活 異地多活是…

Kettle學習

一、Kettle 簡介 Kettle(現稱為 Pentaho Data Integration)是一款開源ETL工具,支持從多種數據源抽取、轉換和加載數據,廣泛應用于數據倉庫構建、數據遷移和清洗。其核心優勢包括: 可視化操作:通過拖拽組件設計數據處理流程(轉換和作業)。多數據源支持:數據庫(MySQL/…

蘋果計劃2026年底前實現美版iPhone“印度造”,以減輕關稅及地緣政治風險

基于 6 個來源 據多家媒體報道&#xff0c;蘋果公司計劃在2026年底前&#xff0c;實現在印度組裝銷往美國的大部分或全部iPhone手機&#xff0c;以減輕關稅和地緣政治緊張局勢帶來的風險。這一目標意味著蘋果需將印度的iPhone產量增加一倍以上&#xff0c;凸顯其供應鏈多元化戰…

【C++】googletest_TEST/TEST_F

在 Google Test 框架中&#xff0c;TEST 和 TEST_F 是定義測試用例的兩個核心宏&#xff0c;它們的區別主要體現在 測試上下文的管理方式 上。以下是二者的詳細對比&#xff1a; 1. TEST 宏 定義方式 TEST(TestSuiteName, TestName) {// 測試邏輯 }特點 獨立上下文&#xff…

14-DevOps-快速部署Kubernetes

在學習階段&#xff0c;為了能快速部署Kubernetes&#xff0c;這里用一個快速安裝工具&#xff1a;Kubeode&#xff0c;來完成Kubernetes的部署。 接下來部署一個單機&#xff0c;一主一從的Kubernetes。一主一從都部署在同一臺服務器上。 在虛擬機新開一個服務器&#xff0c…

Java 異常處理全解析:從基礎到自定義異常的實戰指南

Java 異常處理全解析&#xff1a;從基礎到自定義異常的實戰指南 一、Java 異常體系&#xff1a;Error 與 Exception 的本質區別 1. 異常體系核心架構 Java把異常當作對象來處理&#xff0c;并定義一個基類java.lang.Throwable作為所有異常的超類。 在Java API中已經定義了許…

redis 數據類型新手練習系列——string類型

redis 數據類型 Redis 主要支持以下幾種數據類型&#xff1a; &#xff08;1&#xff09;string&#xff08;字符串&#xff09;: 基本的數據存儲單元&#xff0c;可以存儲字符串、整數或者浮點數。 &#xff08;2&#xff09;hash&#xff08;哈希&#xff09;:一個鍵值對集…

Android12源碼編譯及刷機

由于google的AOSP源碼拉取經常失敗&#xff0c;編譯還經常出現各種問題。這里根據香橙派Orange Pi 5 Plus&#xff08;Android12電視鏡像&#xff09;源碼進行編譯演示。 RK芯片的開發板可玩性很高&#xff0c;這里以電視版本android系統為例子&#xff0c;學習的同時還可以當…

從零實現 registry.k8s.io/pause:3.8 鏡像的導出與導入

以下是為 registry.k8s.io/pause:3.8 鏡像的導出與導入操作定制的完整教程&#xff0c;適用于 Kubernetes 集群中使用 containerd 作為容器運行時的場景。本教程包含詳細步驟、常見問題解析及注意事項。 從零實現 registry.k8s.io/pause:3.8 鏡像的導出與導入 背景說明 Kuber…

Redis和MQ的區別

redis是一個高性能的key-value數據庫&#xff0c;支持消息推送功能&#xff0c;可以當做一個輕量級的隊列服務器使用。 redis只是提供一個高性能的、原子操作內存鍵值隊&#xff0c;具有高速訪問能力&#xff0c;雖然可以做消息隊列的存儲&#xff0c;但不具備消息隊列的任何功…

Centos7系統防火墻使用教程

CentOS 7是一種常見的Linux操作系統&#xff0c;防火墻作為網絡安全的第一道防線&#xff0c;對于服務器的安全至關重要。本文將介紹CentOS 7系統中防火墻的使用教程&#xff0c;包括如何開啟、關閉、配置以及防火墻規則的添加和刪除。 一、查看防火墻狀態 在開始操作之前&am…

Uniapp:navigator(頁面跳轉)

目錄 一、基本概述二、屬性說明三、具體使用一、基本概述 頁面跳轉。該組件類似HTML中的<a>組件,但只能跳轉本地頁面。目標頁面必須在pages.json中注冊。 二、屬性說明 屬性名類型默認值說明平臺差異說明urlString應用內的跳轉鏈接,值為相對路徑或絕對路徑,如:“……

大疆機場及無人機上云(航線規劃、指令飛行...)

系統操作預覽&#xff1a; 包含一鍵起飛、指令飛行、云臺控制、變焦、航線規劃、空域規劃、成果數據展示、實時飛行模擬、任務派發等 大疆無人機飛控平臺&#xff08;航線規劃、機場3、私有化部署&#xff09;_嗶哩嗶哩_bilibili 2025-04-02 更新 start、 已支持大疆機場3。…

【運維】云端掌控:用Python和Boto3實現AWS資源自動化管理

《Python OpenCV從菜鳥到高手》帶你進入圖像處理與計算機視覺的大門! 解鎖Python編程的無限可能:《奇妙的Python》帶你漫游代碼世界 在云計算時代,AWS(Amazon Web Services)作為領先的云服務平臺,其資源管理的高效性對企業至關重要。本文深入探討如何利用Python的boto3…