类欧几里得算法浅谈(部分)

学习类欧几里得算法,因为是蒟蒻,感觉网上很多都看不懂,所以自己写一篇快活快活


第一类求和式:

\(F(a,b,c,n)=\sum_{i=0}^n\lfloor\frac{a*i+b}{c}\rfloor\)


对于这样形式的求和,我们有以下的推导:

1.当\(a>=c\)并且\(b>=c\)时,我们有:

对于\(\lfloor\frac{a}{c}\rfloor\),

它实际等价于\(\lfloor\frac{a\mod c}{c}\rfloor+\lfloor\frac{a}{c}\rfloor\),

于是对于原先的式子,我们可以推出:

\(F(a,b,c,d,n)=\sum_{i=0}^n\lfloor\frac{a*i+b}{c}\rfloor\) =\(\sum_{i=0}^n(\lfloor\frac{a\mod c*i+b\mod c}{c}\rfloor+\lfloor\frac{a*i}{c}\rfloor+\lfloor\frac{b}{c}\rfloor)\)

进一步化为递归的形式就是:

\(F(a\%c,b\%c,c,n)+\frac{(n+1)n}{2}*\lfloor\frac{a}{c}\rfloor+(n+1)*\lfloor\frac{b}{c}\rfloor\)

2.当\(a<c\)或者\(b<c\)时我们有:

我们观察可以很容易的发现,原先的和式的右边一大堆,去掉下取整实际上表示出来就是一条直线,即:

\(F=kx+b\),(\(k=\frac{a}{c},b=\frac{b}{c})\),

然后我们就可以轻轻松松的画出一个一次函数的图像,在坐标系里表现出的就是一个直角梯形,函数的定义域\(D\in[0,n]\),函数的值域\(Z\in[b,m]\),其中令\(m=\frac{a*n+b}{c}\),也就是当\(i\)等于\(n\)时的值.我们要求定义域内函数值的和,自然就是求积分,也就是这个直角梯形的面积.然后加上下整除符号,我们需要求出的就是这个梯形内整点的个数.

我们枚举所有整点的纵坐标,就有:

\(F=\sum_{i=0}{n}\sum_{j=1}{m}[\lfloor\frac{a*i+b}{c}\rfloor>=j]\)

\(=\sum_{i=0}{n}\sum_{j=0}{m-1}[\lfloor\frac{a*i+b}{c}\rfloor>=j+1]\)

对于\([\lfloor\frac{a*i+b}{c}\rfloor>=j+1]\),我们知道,大于等于去掉下整除依旧成立,于是

\(=\sum_{i=0}^{n}\sum_{j=0}^{m-1}[(\frac{a*i+b}{c})>=j+1]\)

将分母乘过去,\(b\)移过去:

\(=\sum_{i=0}^{n}\sum_{j=0}^{m-1}[a*i>=j*c+c-b]\)

\(a\)除过去:

\(=\sum_{i=0}^{n}\sum_{j=0}^{m-1}[i>=\frac{(j*c+c-b)}{a}]\)

我们注意到,\(j\)的变化与\(i\)是无关的,于是我们可以将两个\(\sum\)交换

\(=\sum_{j=0}^{m-1}\sum_{i=0}^{n}[i>=\frac{(j*c+c-b)}{a}]\)

\(=\sum_{j=0}^{m-1}\sum_{i=0}^{n}[i>\frac{(j*c+c-b-1)}{a}]\)

(分子减一,去掉等号)

去掉内层\(sigma\):

\(=\sum_{j=0}^{m-1} n-\frac{(j*c+c-b-1)}{a}\)

(这个显然等价)

\(=n*m-\sum_{j=0}^{m-1} \frac{(j*c+c-b-1)}{a}\)

老规矩,转换成递归形式:

\(=n*m-F(c,c-b-1,a,m-1)\)

(完)



(待补)

原文地址:https://www.cnblogs.com/KatouKatou/p/9745998.html

时间: 2024-10-10 22:01:51

类欧几里得算法浅谈(部分)的相关文章

【内存类操作】浅谈内存拷贝异常

结合本人在实际项目中所积累的经验,以及曾经犯过的错误,堆内存操作类函数做一个简单的剖析,抛砖引玉,欢迎大家吐槽. 首先,讲一下内存使用异常发生的几种场景. 1.野指针的使用,使用已经释放的指针,如果向野指针中写内容,就极有可能导致设备重启或任务挂死.因为,正在运行的任务的地址被意外的改写. [避免策略]函数入参要判空,指针使用(包括释放)之前一定要释放. 2.内存函数的错误使用: void *memset(void *s, int ch, size_t n); c语言中在<memory.h>或

bzoj3817 Sum 类欧几里得算法

这道题目solution写了两种做法,都讲一下吧. 首先,令x=r^0.5,显然,如果x>2,则可以不断减2到小于二:如果x>1,那么变为2-x.因此此时必有x<1.(特判r为完全平方数的情况).那么令y=1/x,则: 题目等价于在数轴从0~n,以y长度为一个区间(左闭右开)黑白交替染色,求黑色部分覆盖的整点减去白色部分覆盖的整点.然后把最后面零散的部分暴力计算,如果最后一个是黑色的也暴力计算.那么这个时候黑白段数相等,且每一段黑(白)都至少覆盖[y]个点恰好各自抵消[y],那么将每一段

[P5170] 类欧几里得算法

のすたの"类欧几里得算法"第二题 P5170 [题意]已知\(n,a,b,c\),求 \[ \begin{aligned} f_{1}(a,b,c,n)&=\sum_{i=0}^n\lfloor\dfrac{ai+b}{c}\rfloor\f_{2}(a,b,c,n)&=\sum_{i=0}^n\lfloor\dfrac{ai+b}{c}\rfloor^2\f_{3}(a,b,c,n)&=\sum_{i=0}^n\lfloor\dfrac{ai+b}{c}\rf

BZOJ3817 Sum(类欧几里得算法)

设$t=\sqrt r$,原题转化为$\sum_{x=1}^n(4*\lfloor\frac{tx}2\rfloor-2*\lfloor tx\rfloor)$考虑如何求$\sum_{x=1}^n\lfloor\frac{bt+c}ax\rfloor$开始我写了一个真欧几里得来求直线下整点数目,然后由于里头含小数所以不对.于是学习了一下新姿势,思想其实差不多.先把a,b,c同时除以gcd(a,b,c),防止爆int.之后把斜率变成$\frac{bt+c}a-\lfloor\frac{bt+c}a

类欧几里得算法

对于求和式 $f(a,b,c,n)=\sum_{i=0}^n \lfloor \frac{ai+b}{c} \rfloor$ 当 $a \geq c$ 或 $b \geq c$ 时,设 $a'=a \; mod \; c$,$b'=b \; mod \; c$,有 $$\begin{align*} f(a,b,c,n) = & \sum_{i=0}^n \; \lfloor \frac{ai+b}{c} \rfloor \\ = & \sum_{i=0}^n \; \lfloor \fra

回溯法浅谈

回溯法是初学者学习暴力法的第一个障碍,所谓回溯就是指当把问题分成若干步骤并递归求解时,如果当前步骤没有合法选择,则函数将返回上一级递归调用,这种现象称为回溯.正是因为这个原因,递归枚举算法常被称为回溯法,应用十分普遍. 八皇后问题 1 int tot=0; 2 int c[maxn]; //c[x]表示x行所在的列数 3 void dfs(int n,int cur){ 4 if(cur==n) ++tot; 5 for(int i=0;i<n;i++){ 6 int flag=0; 7 c[c

数论,类欧几里得算法

类欧几里得部分转载自不来也不去的一只失忆蝴蝶.%%%

[补档计划] 类欧几里得算法

$$\begin{aligned} f(a, b, c, n) & = \sum_{i = 0}^n \lfloor \frac{ai + b}{c} \rfloor \\ & = \sum_{i = 0}^n \sum_{j = 0}^{m-1} [j < \lfloor \frac{ai + b}{c} \rfloor] \\ & = \sum_{i = 0}^n \sum_{j = 0}^{m-1} [j + 1 \le \lfloor \frac{ai + b}{c}

模板 - 类欧几里得算法

用来快速求解 $\sum\limits_{i=0}^{n}\lfloor \frac{ai+b}{c} \rfloor,\sum\limits_{i=0}^{n}{\lfloor \frac{ai+b}{c} \rfloor}^2,\sum\limits_{i=0}^{n}i\lfloor \frac{ai+b}{c} \rfloor $ 有多快呢?据说是log的?反正abc取1e9可以200ms过1e5组询问-- #include <bits/stdc++.h> typedef long l