qbxt Day3 on 2019-8-18

一、基础数论

1.进制转换

进制转换是一个非常简单且基础的问题。

也许我们只需要...Emmm...

列个式子就好了鸭

设\(k\)进制数每一位上是\(a_i\),那么\((x)_k=\sum\limits_{i=1}^{\texttt{位数}}a_i*k^{i-1}\)

这是任意进制下数字的转换

和进制的转换有关的题目大多数围绕这个式子有关。

(NOIp普及组那个可以直接表示一位就够了)

2.辗转相除法(欧几里得算法)

辗转相除法应该是最简单的数论(数论只会gcd)

然后实现方式也很简单,是log级别的。

inline int gcd(int a, int b)
{
int temp;
while (b) temp=a,a=b,b=temp%b;
return a;
}

为什么呢?我们假设\(a\geq b\),那么\(a{\%}b\leq \frac{a}{2}\)。

因此我们这样做的复杂度上限应当最大就是\(O(logn)\)的。

证明的话

由裴蜀定理可以推得,\(gcd(a,b)=gcd(b,a\%b)\),所以我们一直向下直到......\(b=0\)即可。

然后\(lcm(a,b)\)的话其实就是\(\frac{a\times b}{gcd(a,b)}\)

3.扩展欧几里得(exgcd)

这个算法是算一个等式的一组特解

\[x\cdot a+y\cdot b=gcd(a,b)
\]

然而这个算法其实也是一个log的

怎么做呢

就是根据\(gcd(a,b)=a(b=0)\),然后我们一直先递归求\(gcd(a,b)\),然后直到某一层\(k\)会有一个

\[gcd(a,b)\cdot x_k+0\cdot y_k = gcd(a,b)
\]

显然这个时候\(x_k=1,y_k=0\)

那么我们怎么根据这个式子往回回溯求一开始的\(x_0,y_0\)呢?

我们可以举一个例子(举第一层的例子吧)

设\(a\cdot x_0+b\cdot y_0=gcd(a,b)\)

那么下一层就是\(b\cdot x_1+(a\bmod b)\cdot y_1=gcd(a,b)\)

我们可以知道\((a\bmod b)=a-b\cdot\big\lfloor{\frac{a}{b}}\big\rfloor\),而且\(a\cdot x_0+b\cdot y_0=b\cdot x_1+(a\bmod b)\cdot y_1\)

替换式子之后会得到\(a\cdot x_0+b\cdot y_0=b\cdot x_1+(a-b\cdot\big\lfloor{\frac{a}{b}}\big\rfloor)\cdot y_1\)

拆开,得到\(left=a\cdot y_1+b(x_1-\big\lfloor{\frac{a}{b}}\big\rfloor\cdot y_1)\)

于是乎因为\(a,b\)都是一样的

那么\(x_0=y1,y_0=x_1-\big\lfloor{\frac{a}{b}}\big\rfloor\cdot y_1\)

回溯就可以了

代码实现:

//返回的是gcd(a,b)
int exgcd(int a,int b,int &x,int &y)
{
if (b==0) //可以直接回溯了
{
x = 1, y = 0;
return;
}
int d = exgcd(b, a % b, x, y);
int temp = x; //
x = y; //
y = temp - (a / b) * y; //从下一层向这一层回溯
return d;
}

有三个重要的式子,这里就不再赘述 反正我也不会证明

4.数论分块

烧脑预警

首先我们了解\(\big\lfloor{\frac{x}{i}}\big\rfloor,i\in [1,x]\)的话是只有\(\sqrt{x}\)种取值的。

至于证明的话,我们可以分\([1,\sqrt{x}]\)和\([\sqrt{x}+1,x]\)两部分

因为我们知道前半部分是有\(\sqrt{x}\)种取值的,那么由于因子是对称的,因此另外一部分也是有\(\sqrt{x}\)种取值的。

因此我们直接开始Emmm...枚举根号次就好了

代码模板

void fenkuai(int n)
{
for (int i = 1, last; i <= n; i = last + 1)
{
int a = n / i;
last = n / a; // n / (n / i) 是与 n / i相同值的最大i......
/* your code */
}
}

然后呢,这样可以优化某一些枚举\(\big\lfloor{\frac{x}{i}}\big\rfloor\)的值的数论题目......

几个例题

1.求:

\[\sum\limits_{i=1}^n(\big\lfloor\frac{n}{i}\big\rfloor)^3*i\pmod {1e9+7}
\]

数据范围:

\[n\leq 10^9
\]

一看只好跑一个数论分块

首先我们知道上面的结论之后可以直接优化

就是说\((\big\lfloor\frac{n}{i}\big\rfloor)^3\)的取值只有\(\sqrt{n}\)种,因此我们合并有这一项的式子,可以得到

\[\sum\limits_{i=1}^n(\big\lfloor\frac{n}{i}\big\rfloor)^3*i = \sum\limits_{i=1,i=n/(\lfloor n/i\rfloor)+1}^n(\big\lfloor\frac{n}{i}\big\rfloor)^3*\frac{(l+r)\cdot(r-l+1)}{2},l=\frac{n}{i},r=\frac{n}{\frac{n}{i}}
\]

这样就直接求了qwq

(LaTeX打得我心痛)

算了剩下的例题实在是不想敲了QAQ

二、质数筛法和欧拉函数

1.埃拉托色尼筛法

这个应该是最熟悉的了吧......

每次拿到一个质数,摁着质数向下筛他的倍数。

由于质数是log的,质数的倍数是log(log)级别的,因此整个算法的复杂度就是\(O(nlog(logn))\)的。

这个算法的最大缺点在于一个数有可能会被筛很多遍

这是没有必要的鸭

因此我们设计了一个方式防止重复筛一个数

只让一个数的最小的因子筛掉他

2.欧拉筛

没错就是它。

我们每次筛掉一个数一定是被最小的因子筛掉(除去1是预处理的)

于是我们就可以直接枚举质数p,当i可以被某一个质数筛掉,就停下筛下一个数。

为什么这样做是对的???

因为避免了大的质数筛掉较小的数字,保证了每一个数只会被筛一次。

当然同时我们还可以预处理每一个数的最小的因子,得到这个数组之后我们可以log时间内枚举一个数的所有质因子。

3.欧拉筛配备积性函数

这有什么好说的......

首先积性函数就是指在自然数范围内\(f(a)\cdot f(b)=f(a\cdot b)\)的函数。

然后的话有欧拉函数和莫比乌斯函数作为积性函数的代表,登上历史舞台。

代码先鸽这着...

4.组合数

组合数当然是开心至极

那句小葱同学******是什么来着???

定义\(C^n_k\)表示在n个元素中取出k个元素的方案数

通常情况下我们计算组合数都要搭配容斥原理来做各种毒瘤。

然后这个容斥原理还要搭配莫比乌斯函数来进行毒瘤。

来个例题

给定n个数的序列\(a_1..a_n\),求将序列分成两组使得两组的or和相等(数据保证有解)的方案数。

数据范围:

\[n\leq 50,0\leq a_i\leq 2^{20}
\]

那岂不是直接就做了(大雾)

我们按照每一个二进制位考虑

假设现在我们在检查第i个位,有以下几种情况:

  1. 数据中所有的数这一位都是0或者1

    那么这样就直接不用计数了,怎样分都是一样的......答案乘\(C^n_{\frac{n}{2}}\)
  2. 如果不是都是1,那么必须有一组里面的数这一位有1,但是这并不好统计不是吗

    但是我们可以考虑统计补集

    然后套一个并查集就OK了

代码还是不写

5.组合八题

什么毒瘤

  • 小球不等价,盒子不等价,盒子可以为空,有多少种方案?
  • 小球不等价,盒子不等价,盒子不能为空,有多少种方案?
  • 小球不等价,盒子等价,盒子不能为空,有多少种方案?
  • 小球不等价,盒子等价,盒子可以为空,有多少种方案?
  • 小球等价,盒子不等价,盒子可以为空,有多少种方案?
  • 小球等价,盒子不等价,盒子不能为空,有多少种方案?
  • 小球等价,盒子等价,盒子不能为空,有多少种方案?
  • 小球等价,盒子等价,盒子可以为空,有多少种方案?

具体是什么上网上去查吧......

qbxt Day3 on 2019-8-18的更多相关文章

  1. 2019.3.18考试&2019.3.19考试&2019.3.21考试

    2019.3.18 C O D E T1 树上直接贪心,环上for一遍贪心 哇说的简单,码了将近一下午终于码出来了 感觉自己码力/写题策略太糟糕了,先是搞了一个细节太多的写法最后不得不弃疗了,然后第二 ...

  2. MySQL存储过程-2019/7/18

    MySQL 5.0 版本开始支持存储过程. 存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象. 存储过程是为了完成特定功能的SQL语句集,经编 ...

  3. 6362. 【NOIP2019模拟2019.9.18】数星星

    题目描述 题解 一种好想/好写/跑得比**记者还快的做法: 对所有询问排序,按照R递增的顺序来处理 维护每个点最后一次被覆盖的时间,显然当前右端点为R时的答案为所有时间≥L的点的权值之和 LCT随便覆 ...

  4. HPU积分赛 2019.8.18

    A题 给出n个数,问这n个数能不能分成奇数个连续的长度为奇数并且首尾均为奇数的序列 Codeforces849A 题解传送门 代码 1 #include <bits/stdc++.h> 2 ...

  5. 2019/4/18 wen 线程

  6. Python脱产8期 Day06 2019/4/18

    一 深浅拷贝 例:ls = [1, 'abc', [10]] 1.值拷贝:s1 = ls    # ls1直接将ls中存放的地址拿过来,>ls内部的值发生任何变化,ls1都会随之变化. 2.浅拷 ...

  7. [hgoi#2019/2/18]比较水

    T1--调换纸牌(card) Alex有 n张纸牌,每张纸牌上都有一个值ai,Alex把这些纸牌排成一排,希望将纸牌按值从小到大的顺序排好.现在他把这个任务交给你,你只能进行一种操作:选中一张牌,然后 ...

  8. 2019.03.18 连接my sql

    11.登陆功能(链接MySQL) python manage.py starapp movie 新建一个应用模块之后要记得到setting添加这个应用模块 在python2中你还有去导入一个MySQL ...

  9. 2019.04.18 第六次训练 【2018-2019 ACM-ICPC, NEERC, Southern Subregional Contest, Qualification Stage】

    题目链接: https://codeforces.com/gym/101911 又补了set的一个知识点,erase(it)之后it这个地址就不存在了,再引用的话就会RE A: ✅ B:  ✅ C: ...

随机推荐

  1. HDU 2063 过山车 (匈牙利算法)

    题目链接:HDU 2063 Problem Description RPG girls今天和大家一起去游乐场玩,终于可以坐上梦寐以求的过山车了.可是,过山车的每一排只有两个座位,而且还有条不成文的规矩 ...

  2. poj1163The Triangle(动态规划,记忆化搜索)

    7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 (Figure 1) Figure 1 shows a number triangle. Write a program that calc ...

  3. 网络流强化-UVA10480

    做这道题,自己先是想了好几种找被割的边的方法——都被否决了. 后来发现是最小割:只要一条边的两端在不同的点集里面就代表是被割掉的满流边(这些满流边的流量和等于最大流的流量与最小割的权值和). 但是之前 ...

  4. CSAPP:局部性原理

    一个编写良好的计算机程序常常具有良好的局部性(locality).局部性通常有两种不同的形式:时间局部性(temporal locality)和空间局部性(spatial locality).在一个具 ...

  5. Js类的静态方法与实例方法区分以及jQuery如何拓展两种方法

    上学时C#老师讲到对象有两类方法,静态方法(Static)和实例方法(非Static),当时不理解静态是为何意,只是强记. 后来从事前端工作,一直在对类(即对象,Js中严格来说没有类的定义,虽众所周知 ...

  6. Linux的mysql部署

    1.  先输入代码yum install wget -y才可以做后面的 2.下载并安装MySQL官方的 Yum Repository   代码: wget -i -c http://dev.mysql ...

  7. 前端最常用的跨域方式--jsonp

    jsonp通过动态创建script标签的方式来实现跨域通信.原理是浏览器允许html标签在不同的域名下加载资源. <script> var script = document.create ...

  8. 转义BABEL的POLYFILL和RUNTIME的区别

    babel-polyfill 使用场景 Babel 默认只转换新的 JavaScript 语法,而不转换新的 API.例如,Iterator.Generator.Set.Maps.Proxy.Refl ...

  9. 21、numpy—Matplotlib

    NumPy Matplotlib Matplotlib 是 Python 的绘图库. 它可与 NumPy 一起使用,提供了一种有效的 MatLab 开源替代方案. 它也可以和图形工具包一起使用,如 P ...

  10. P4553 80人环游世界(上下界费用流)

    P4553 80人环游世界 emm......先从上下界网络流(转)开始 再到现在的上下界费用流 因为有上下界,我们需要记下每个点的流量差$ex[i]$,用于调整 $ins(x,y,l,r,v)=li ...