首页 > 其他分享 >数论分块

数论分块

时间:2023-10-15 15:55:07浏览次数:39  
标签:const 分块 数论 long int ans

数论分块

在P2424偶然学到了这个算法,觉得很有意思,于是单拎出来再学习一下。

数论分块,又叫整数分块,解决 $f(n) = \sum_{i=1}^{n}g(i) \times \lfloor \frac{n}{i} \rfloor$ 一类问题。观察发现 是成段出现,比如说 时数列是这样的:

设区间的右端点为 ,$r = \frac{n}{\lfloor \frac{n}{l} \rfloor} $ ,

证明如下:

,所以 ,因此

有了左右端点后,就可以 求块内的答案,总复杂度

总结一下,数论分块用于在较优时间复杂度内计算可分为一些块的式子,通过将贡献相同的下标合为一块一起计算块内答案,从而起到优化时间复杂度的作用。

还有一些常用的公式:

题目

P3935 Calculating

不难发现 的值就是 的约数个数,然后就是板子。

// 
// #include<bits/stdc++.h>
// #define int long long
// using namespace std;
// void solve(){
// 	int ans = 0;
// 	int n;
// 	scanf("%lld", &n);
// 	int r = 1;
// 	for(register int l = 1; l <= n; l = r + 1){
// 		r = n / (n / l);
// 		ans += (r - l + 1) * (n / l);
// 	}
// 	printf("%lld\n", ans);
// 	return;
// }
// signed main(){
// 	int T;
// 	cin >> T;
// 	while(T --){
// 		solve();
// 	}
// }
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=1e6+7;
const int mod = 998244353;
int solve(int n){
	if(n<=1) return n;
	int ans=0;
	int r;
	for(int l=1;l<=n;l=r+1){
		r=n/(n/l);
		ans+=(n/l)*(r-l+1);
	}
	return ans;
}
int query(int n){
	int r;
	int ans = 0;
	for(int l = 1; l <= n; l = r + 1){
		r = n / (n / l);
		ans += (n / l) * (r - l + 1);
		ans %= mod;
	}
	return ans % mod;
}
signed main(){
	int l, r;
	cin >> l >> r;
	cout << (query(r) - query(l - 1) + mod) % mod;
}

P2261 [CQOI2007] 余数求和

式子可以转换成 ,然后就是板子。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=1e6+7;
int query(int n, int k){
	int r;
	int ans = 0;
	for(int l = 1; l <= n; l = r + 1){
		if(k / l == 0) r = n;
		else r = k / (k / l);
	if(r &gt; n) r = n;
	ans += (k / l) * (r - l + 1) * (l + r) / 2;
}
return n * k - ans;

}
signed main(){
int n, k;
cin >> n >> k;
cout << query(n, k);
}

 

还有些题 鸽到csp之后吧

标签:const,分块,数论,long,int,ans
From: https://www.cnblogs.com/wwyyyy/p/17765706.html

相关文章

  • 数论筛法小记
    BaseSievebaseDirichletConvolutionSqrtDecomposition会挖坑,好让复习的时候长脑子。以下所有\(p\)都是质数,即\(p\in\mathbb{P}\),同时默认均为正整数。Base唯一分解定理(算术基本定理):\[\begin{align} \foralln>1,n=\prod\limits_{i=1}^kp_i^{t_i}\end{align}\]......
  • 14.3 Socket 字符串分块传输
    首先为什么要实行分块传输字符串,一般而言Socket套接字最长发送的字节数为8192字节,如果发送的字节超出了此范围则后续部分会被自动截断,此时将字符串进行分块传输将显得格外重要,分块传输的关键在于封装实现一个字符串切割函数,将特定缓冲区内的字串动态切割成一个个小的子块,当切割结......
  • 整除分块
    证明数论分块板子求$\large\sum_{i=1}^n[n/i]$,其中$n\leq10^{10}$很明显,暴力求的复杂度是$O(n)$的,需要优化其中,例$n=10$时,$[10/4]=[10/5]$是有相等的值的不妨设第一个$[n/i]=x$的数为$l$则最后一个有$[n/i]=x$的数$\larger=[\frac{n}{[n/l]}]$理由如......
  • 整除分块学习笔记
    模型求\(\large\sum^{n}_{i=1}\lfloor{\frac{n}{i}}\rfloor\)假设\(n\)等于10,我们可以列出下表:\(\i\)12345678910\(\frac{10}{i}\)10532211111如果我们的\(n\)更大时,我们可以发现\(\frac{10}{i}\)中有许多重复的地方。我们可以......
  • 学到了,原来 gzip 是种`连续分块`的压缩算法
    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!cnblogs博客zhihuGithub公众号:一本正经的瞎扯我想要表述的是:假设有10mb的数据使用gzip算法来压缩。有这样可能的做法:分配10mb的缓冲区,一次压缩10mb分配1mb的缓冲区,每次压缩1mb,分为十次压缩如果压......
  • 【整除分块】【DP】ABC239Ex Dice Product 2 题解
    ABC239H简单题。令\(f_i\)表示乘到\(\gei\)的期望。容易得到\(f_i=\dfrac{\sum\limits_{j=1}^{n}f_{\lceil\frac{i}{j}\rceil}}{n}\)。将\(f_i\)移到同一边,去掉系数,有\(f_i=\dfrac{n\sum\limits_{j=2}^{n}f_{\lceil\frac{i}{j}\rceil}}{n-1}\)。提出\(\frac{n-1}{n......
  • 【ACM算法】整数分块
    思考如何计算以下算式:\[\sum_{i=1}^{n}\lfloor\frac{n}{i}\rfloor\qquad(n\le10^6)\]所有人都会觉得这个非常简单,一个for循环可以直接解决,时间复杂度\(O(n)\),但是如果将\(n\)的范围改大一点点,改成\(n\leq10^{12}\)呢?这时如果我们用朴素算法一定会T;但是我们可以手......
  • 分块+ST的RMQ
    期望\(O(n)-O(1)的RMQ\)#include<bits/stdc++.h>#defineintlonglong#defineF(i0,i1,i2)for(inti0=(i1);i0<=(i2);++i0)usingnamespacestd;inlineintrd(){ intx=0,f=0;charch=getchar(); while(!isdigit(ch)){if(ch=='-')f=1;ch=getchar(......
  • 理论的动态发展完完备与进化:数论Number Theory数域的进化史 与 Infinite Precision无
    InfinitePrecision:(0)数是什么?以有限的数元,度量与表示无限的现象、事物与状态,作为整个数学科学理论的根基。以Binary二进制为例,有{0,1},Constant/Dynamic系统建模上,两种state(状态)?0->1与1->0代表“change变化”?而Decimal十进制,有{0,1,2,3,4,5,6,7,8,9}十种数元,运算符号......
  • [Резюме] 基础数列分块
    Preface分块可以\(O(n\sqrt{n})\)解决不能用线段树解决的问题,即不能快速合并区间信息的问题,是很多高级算法与数据结构的基础。本篇只是作者基础入门的一些感受,例题为\(\text{LOJ}[6277,6285]\),下一步计划学习莫队算法,这里有学习总结。Content0如何分块?考虑将标准块大小定......