![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数论
文章平均质量分 53
qq_38232157
这个作者很懒,什么都没留下…
展开
-
洛谷 P2350 [HAOI2012]外星人(素因子分解,欧拉函数)
素因子分解,欧拉函数原创 2022-10-21 23:24:32 · 256 阅读 · 0 评论 -
洛谷 P4345 [SHOI2015]超能粒子炮·改(卢卡斯定理)
卢卡斯定理,递推公式原创 2022-10-20 23:06:46 · 103 阅读 · 0 评论 -
洛谷 P3807 【模板】卢卡斯定理/Lucas 定理
卢卡斯定理, 逆元,费马小定理原创 2022-10-20 19:24:36 · 177 阅读 · 0 评论 -
洛谷 P1306 斐波那契公约数 (矩阵快速幂, 辗转相除法)
矩阵快速幂, 辗转相除法原创 2022-10-20 15:21:03 · 177 阅读 · 0 评论 -
洛谷 P2158 [SDOI2008] 仪仗队(欧拉函数,水题)
1、数据范围原创 2022-10-14 12:59:25 · 399 阅读 · 0 评论 -
洛谷 P1390 公约数的和(欧拉函数)
1、 数据范围原创 2022-10-14 11:58:11 · 452 阅读 · 0 评论 -
洛谷 P1865 A % B Problem(素数筛法,前缀和,水题)
洛谷 P1865 A % B Problem(素数筛法,前缀和,水题)1、 数据范围很小原创 2022-10-14 11:19:15 · 181 阅读 · 0 评论 -
洛谷 P1835 素数密度(素数筛法)
1、先打印素数表 ,范围是 sqrt(2147443647), 这里大概取值 47000。 为了避免 int 的溢出,所有数据用 long long2、用素数扫描区间 [L, R], 每一素数满足 L原创 2022-10-14 10:25:14 · 460 阅读 · 0 评论 -
洛谷 P1621 集合(并查集,素数筛法)
并查集,素数筛法原创 2022-10-14 09:31:44 · 166 阅读 · 0 评论 -
P2398 GCD SUM 欧拉函数
筛法素数, 欧拉函数原创 2022-10-13 14:50:33 · 179 阅读 · 0 评论 -
洛谷 P5091 【模板】扩展欧拉定理
扩展欧拉定理本题要点:1、m <= 10^8, 先求出m的欧拉函数 phm. 先求出 m的素因子 p1 ~ pkphm = m * (p1 - 1) / p1 * (p2 - 1) / p2 * … * (pk - 1) / pk2、b 是一个大数, 不过这里需要关注的是 b % phm 的值。所以,可以一个数字一个数字的读累加到一定数量,对 phm求模。3、扩展欧拉定理:a^b(mod m) = a^(b % phm + phm), 如果 b < phm这里涉及快速幂, 用lo原创 2020-09-22 21:47:13 · 192 阅读 · 1 评论 -
洛谷 P4549 【模板】裴蜀定理
裴(pei)蜀定理引理:对于给定的正整数a,b,方程ax+by=c有解的充要条件为c是gcd(a,b)的整数倍裴(pei)蜀定理:方程ax+by+cz+…+nm=f(其中a,b,c…n,f为整数)有解的充要条件是f为gcd(a,b,c,…,n)的整数倍定理的应用:给定一个序列{an},求一个整数序列{bn}使得a1b1+a2b2+…+an*bn值最小(要求最小值为正数),求这个最小值解:根据裴蜀定理的推广,原式最小值即为gcd(a1,a2…an)#include <cstdio>原创 2020-09-22 16:27:12 · 135 阅读 · 0 评论 -
洛谷 P1516 青蛙的约会(扩展欧几里得)
扩展欧几里得两个青蛙跑步,跑的快的,追上跑得慢的。 并且多跑的路程有 L 的整数倍。本题要点:1、假设 A 青蛙 起点 m, 速度为 a, B 青蛙 起点 n, 速度为 b; 如果 a > b, 跑了 x 步,ax + m - (bx + n) = L * y, 化简为:(a - b) * x + L * (-y) = n - m;这里的 n - m 可能是负数,通过模 L , 使得 方程 右边是正整数。从而得到方程: ax + by = c,(a, b, c 都是正整数)2、 如原创 2020-09-22 16:09:17 · 131 阅读 · 0 评论 -
洛谷 P5656 【模板】二元一次不定方程(exgcd)
扩展欧几里得本题要点:1、这里需要解方程 ax + by = c 的所有正整数解。不过,有个前提,a, b, c 都是正整数, 后面方便处理很多。2、记 d = gcd(a, b), 如果 c % d != 0, 说明方程无整数解。3、 用 扩展欧几里得 exgcd 算出 ax + by = gcd(a, b) 的 解 x0, y0;那么原方程 ax + by = c 的所有 整数解可以表示为x = (c/d)x0 + k(b/d)y = (c/d)y0 - k(a/d), 其中,k取遍原创 2020-09-22 13:26:20 · 282 阅读 · 0 评论 -
洛谷 P3868 [TJOI2009]猜数字(中国剩余定理, 快速乘法)
中国剩余定理, 快速乘法本题要点:1、 套用 中国剩余定理 模板,但是注意,这里的 乘法会 爆 long long ,因此,用快速乘法来代替。2、 a[i] <= 10^9, 当计算 某数 z 和 a[i] 相乘, 应该是调用 quick_multi(a[i], z, mod),也就是用 a[i] 去依次乘上 z 的 二进制的每一位。(a[i] 数值较大, z的较小)#include <cstdio>#include <cstring>#include <原创 2020-09-22 11:50:52 · 133 阅读 · 1 评论 -
洛谷 P1495 【模板】中国剩余定理(CRT)/曹冲养猪(中国剩余定理)
中国剩余定理概念:设 m[1], m[2], m[3], …, m[[n] 是两两互质的整数。 方程组x = a[1](mod m[1]) // 注意,这里的 '=' 表示同余符号x = a[2](mod m[2])...x = a[n](mod m[n])方程 的解 x = sum{a[i] * (m / m[i]) * t[i]} (1 <= i <= n)其中, m = m[1] * m[2] * … * m[n],t[i] 满足同余式子:(m / m[i]) * t[原创 2020-09-22 00:26:57 · 199 阅读 · 1 评论 -
洛谷 P1965 转圈游戏(快速幂,水题)
快速幂,水题本题要点:1、 10^k 次之后,x走到的位置是: (m * (10^k) + x) % n 。显然就是快速幂。#include <cstdio>#include <cstring>#include <iostream>using namespace std;const int MaxN = 1e7 + 10;long long n, m, k, x;long long mod;long long quick_pow(long long原创 2020-09-16 21:44:25 · 153 阅读 · 0 评论 -
HOJ 3826 Squarefree number(素数线性筛法)
素数线性筛法题目意思:给出一个数 n <= 10^18, 如果这个数的某个约数是 完全平方数,输出 “No”,否则输出 “Yes”本题要点:1、n 很多,用 long long 。然后开个 MaxN = 10^6 的数组, 在 MaxN 的范围内,收集所有的素数到数组 prime, m 记录素数的个数。 这个过程,使用的是线性筛法,时间复杂度 O(n)2、然后 用 n 去除 MaxN = 10^6 以内的素数, 除完后,如果 n > 1, 说明 n 含有 大于 MaxN = 10^原创 2020-09-16 15:42:06 · 177 阅读 · 0 评论 -
POJ 3048 Max Factor(素数,水题)
素数,水题题目意思:给出n个整数,要求数组这些整数中,拥有素因子最大的哪个整数。如果有多个,输出最早出现的那个。本题要点:1、n <= 20000, 先打素数表。然后对于每一个 数a[i], 求出其最大的素因子 max_fac[i].最后扫描数组 max_fac, 找出最大的那个即可。#include <cstdio>#include <cstring>#include <iostream>using namespace std;const in原创 2020-09-16 14:47:09 · 364 阅读 · 0 评论 -
HOJ 3792 Twin Prime Conjecture(素数,水题)
素数,水题本题要点:1、题目给出一个数 n, 要求 n 以内的数,孪生素数有多少对。先打素数表,数组 twin[k] 表示 k以内的孪生素数有多少对。 先处理 0 ~ 100000 之间的 所有twin[k] 值。后面询问哪个n,之间输出。#include <cstdio>#include <cstring>#include <iostream>using namespace std;const int MaxN = 1e5 + 10;int n;b原创 2020-09-16 14:29:29 · 74 阅读 · 0 评论 -
HOJ 1262 寻找素数对(素数,水题)
素数,水题本题要点:1、n <= 10000. 先打个表 prime,用 vis[i] 表示 数i是否是素数。2、用 lower_bound 来查找第一个 >= m / 2 的 素数,假设下标就是 indx, 在 数组prime 中查找第一个 m - prime[k] 是素数的下标k.#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>原创 2020-09-16 14:09:25 · 132 阅读 · 0 评论 -
HOJ 5686 Problem B(大数递推)
大数递推本题要点:1、递推公式:f[n] = f[n - 1] + f[n - 2]2、推导:n >= 3 时候,如果最后一位是1, 相当于前 n - 1 位的所有 1和2 的排列方式。如果最后一位是 2, 相当于 前 n - 2 位的所有 1和2 的排列方式。#include <cstdio>#include <cstring>#include <iostream>using namespace std;const int MaxN = 2原创 2020-09-13 23:27:10 · 83 阅读 · 0 评论 -
HOJ 5666 Segment(快速乘法)
快速乘法题目意思:判断直线x+y=q与坐标轴围成的三角形“内”的整数点的个数 很容易推出公式 (q-1)*(q-2)/2本题要点:1、 long long的范围, q 是素数, q - 1 是偶数(q > 2). 用 (q - 1) / 2。 记 x = (q - 1) / 2, y = q - 2;2、 用 快速乘法计算 mod p 的乘积, 类似于快速幂。#include <cstdio>#include <cstring>#include <ios原创 2020-09-13 22:33:34 · 79 阅读 · 0 评论 -
CodeForces-1228B Filling the Grid (快速幂,水题)
快速幂,水题题目意思:有个矩阵, row行, col 列。对于每一行, r[i] 表示第i行,从最开始的位置连续 r[i] 个格子,全部涂黑色。注意,隐含的意思就是, 第i行的第 r[i] + 1 个格子是白色。而数组 c[i] 表示的意思大致相同。本题要点:1、矩阵中,用1 表示黑色,0表示白色, -1 表示 可填白色和黑色。 题目问,有多少种涂色方法,就是问有多少个格子可以填 -1 , 假设有 p 个 -1, 答案就是 2^p2、套用快速幂模板,水题。#include <cstd原创 2020-09-11 18:52:37 · 86 阅读 · 0 评论 -
洛谷 P1017 进制转换(数学,进制)
数学,进制本题要点:1、模仿 10 进制数转化为 2 进制的数的过程, 10 进制数转化为 R 进制的数的过程.就是 某个数 n 不断除以 2, 拿到余数r, 这些余数 r 构成的序列,反过来就是对应的2 进制数。2、假设被除数 为 q, 除数是 R, 余数是r, 然后要写出 q = R * q1 + r 的形式, 其中 r 是非负数 ,而且 r 小于等于 R 的绝对值 |R| 。3、 如果除数是 R的话,直接求余运算 % , r = q % R 的话,r 可能得到的是负数,这时候要转化为&原创 2020-09-11 12:16:16 · 111 阅读 · 0 评论 -
HOJ 3240 Counting Binary Trees(卡特兰数,扩欧求逆元,经典)
卡特兰数,扩欧求逆元题目意思:n个节点的二叉树,可以构成有 catalan[n] 种不同的二叉树。 sum[n] 是卡特兰数前 n项的总和。每次给出两个数 n, m, 求 sum[n] % m 是多少。本题要点:1、n很大,如果用大数来存第 100000 个卡特兰数,肯定超时。2、卡特兰数的 递推公式h[i] = h[i - 1] * (4 * i - 2) / (i + 1)要求每一个卡特兰数 对m的模, 这里有除法,需要 求 (i + 1) 在模 m的情况下的逆元。3、扩展欧几里得算法原创 2020-08-28 16:59:19 · 125 阅读 · 0 评论 -
HOJ 4990 Reading comprehension(矩阵快速幂, 裸题)
矩阵快速幂本题要点:1、递推关系,推导矩阵:起始矩阵 resres[0][0] = ans, res[0][1] = 1res[1][0] = 0, res[1][1] = 0i 是奇数的时候, 乘上矩阵 xx[0][0] = 2, x[0][1] = 0x[1][0] = 1, x[1][1] = 1 那么 res * x 的结果矩阵 yy[0][0] = 2 * ans + 1, y[0][1] = 1y1][0] = 0, y[1][1] = 0同理原创 2020-08-21 16:51:54 · 129 阅读 · 0 评论 -
HOJ 6030 Happy Necklace(矩阵快速幂,递推)
矩阵快速幂,递推难度是递推关系,加入红色 用1表示, 蓝色用0 表示,一串就是一个 01 字符串。任意素数长度范围内,1 的个数 >= 0 的个数。假如有一条合法的 01 串,位数是n, 合法项链数是 f(n). 在这条 01 串后面加1, 必然满足要求。构成的长度 n + 1 的新串,以 1 结尾的合法串项链数 f(n)。如果在这条n长度的 01 串后面加0, 相当于 长度为 n - 2 的 01 串后面加上 3位, 其中 第 n + 1 位确定是0, 剩下的第 n - 1 和 n 位, 有原创 2020-08-21 16:11:25 · 126 阅读 · 0 评论 -
HOJ 1757 A Simple Math Problem(矩阵快速幂)
矩阵快速幂本题要点:1、k < 10, 之间输出 (k % mod + mod) % mod2、然后迭代计算 10 <= k <= 18 时候, f(k) 的值3、 建立一个起始矩阵 resres.m[0][0] = f(18), res.m[0][1] = f(17), ..., res.m[0][9] = f(9)res.m[1][0] = f(17), res.m[1][1] = f(16), ..., res.m[1][9] = f(8)...res.m[9][0]原创 2020-08-21 11:47:26 · 69 阅读 · 0 评论 -
HOJ 3117 Fibonacci Numbers(矩阵快速幂,对数求数字的高位)
矩阵快速幂,对数求数字的高位本题要点:1、斐波那契数列 第40 项超过 8位数, 因此前面的39项打表2、fib数列,可以通过矩阵的幂运算来计算,因此,后4位转化为 矩阵的快速幂3、前4位,通过fib数列的通项公式和对数来计算,参考:点这里#include <cstdio>#include <cstring>#include <iostream>#include <cmath>using namespace std;const int N原创 2020-08-18 12:07:18 · 93 阅读 · 0 评论 -
HOJ 1060 Leftmost Digit(对数, 水题)
对数本题要点:1、log(n^n) = n * log(n) = integer(整数部分) + decimal(小数部分)例如 log(3^3) = log(27) = 1.431363764integer = 1, decimal = 0.43136376410 ^ decimal = 10 ^ 0.431363764 = 2.7, 这个是一个不足10 的小数,取整数部分就是答案2、integer 要用 long long因为 n = 1e9, log(n^n) = 90亿, 超过 int原创 2020-08-18 11:27:25 · 71 阅读 · 0 评论 -
HOJ 1568 Fibonacci(对数,数列通项公式)
对数,数列通项公式本题要点:1、数列通项公式 https://blog.csdn.net/queuelovestack/article/details/47859387得到一个近似公式 log10(an)=-0.5*log10(5.0)+((double)n)*log(f)/log(10.0);2、前20项 的斐波那契数列,用数组存好,当n小于等于20,直接输出3、当 某项斐波那契数列x很大:假设给出一个数10234432,那么log(10234432)=log(1.0234432*10^7)原创 2020-08-18 10:55:40 · 121 阅读 · 0 评论 -
HOJ 5392 Infoplane in Tina Town(素因数分解求lcm, 快速幂)
素因数分解求lcm, 快速幂本题要点:1、求循环节例子:62 1 5 3 4 6第一个循环节为1->2->1,即长度=2;第二个循环节为3->5->4->3即长度为=3;第三个循环节6->6;即长度为1;2、素因数分解求lcm假如有若干个循环节, 每个数都分解素因数, num[i] 表示这些数中 素因子为 i 的最大指数,答案 abs 就是所有的素因数相乘(素因子 i 乘 num[i]次)#include <cstdio>#inclu原创 2020-08-17 23:22:41 · 64 阅读 · 0 评论 -
HOJ 5584 LCM Walk(GCD)
GCD题目意思:从 (x,y) 点出发,可以向上或向右走,每次走的距离为 LCM(x,y),即移动后的坐标为 (x+LCM(x,y),y) 或 (x,y+LCM(x,y)),移动若干次后停止在 (ex,ey) 点,问有多少个点可以移动到点 (ex,ey)本题要点:1、加入当前的坐标是 (x1, y1), 那么下一个坐标的位置是 (x1 + lcm(x1, y1), y1) 或者 (x1, lcm(x1, y1) + y1),记 k = gcd(x1, y1), 那么lcm(x1, y1) = k原创 2020-08-12 17:12:16 · 74 阅读 · 0 评论 -
HOJ 2504 又见GCD(最大公约数,水题)
最大公约数,水题本题要点:1、步骤:先假设 a > b, 因为 gcd(a, c) = b, 因此gcd(a / b, c / b) = 1, 从 c / b = 2 开始扫描,找到第一个使得 gcd(a / b, c / b) = 1 的 c / b 的值,就是答案。#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using name原创 2020-08-12 13:46:40 · 93 阅读 · 0 评论 -
HOJ 1019 Least Common Multiple(最小公倍数,水题)
最小公倍数,水题本题要点:1、要求若干个数的最小公倍数,每次求两个,循环求即可。2、注意使用 long long#include <cstdio>#include <cstring>#include <iostream>using namespace std;int T, n;long long gcd(long long a, long long b){ return b == 0 ? a : gcd(b, a % b);}long lon原创 2020-08-12 13:36:26 · 66 阅读 · 0 评论 -
HOJ 1576 A/B(扩展欧几里得)
扩展欧几里得本题要点:1、推导:const int m = 9973, n < m,n = A % 9973, 也就是 n = A % m, 改写为 A = m * x + n而 A 能 整除 B, 假设 A = B * y联立以上两个式子, m * x + n = B * y也就是解方程 -m * x + B * y = n。 解除 y (y = A / B), 答案就是 y % m;2、 方程 -m * x + B * y = n, 一定有解, 因为 gcd(B, n) ==原创 2020-08-12 13:34:01 · 75 阅读 · 0 评论 -
HOJ 2588 GCD(约数,欧拉函数)
约数,欧拉函数题目意思:给出 n, m 两个数(1 <= m <= n < 1e9), 求有多少个数 x ,满足 1 <= x <= n, 使得 gcd(x, n) >= m本题要点:1、先求出 gcd(x, n)(假设等于 g), 那么 gcd(x / g, n / g) = 1, 联想到 欧拉函数x / g <= n / g, 欧拉函数 phi(n / g) 表示 小于 n / g 的数,有多少个与 之互质的。2、解答:先求出 n的所有的约数 y原创 2020-08-12 13:16:21 · 82 阅读 · 0 评论 -
HOJ 1061 Rightmost Digit(快速幂,水题)
快速幂,水题本题要点:1、快速幂,mod = 10, 首先把 base 模 mod 一下。#include <cstdio>#include <cstring>#include <iostream>using namespace std;const int mod = 10;int T, n;int fastPow(){ int base = n % mod, res = 1; while(n) { if(n & 1) {原创 2020-08-10 09:55:44 · 94 阅读 · 0 评论 -
POJ 1811 Prime Test(pollard_rho 算法,裸题)
pollard_rho 算法的裸题题目意思:给出一个数n,如果n是素数,输出 Prime, 否则输出n的最小素因子本题要点:1、pollard_rho 算法求出 n的所有素因子。输出最小的即可。#include <cstdio>#include <ctime>#include <cstring>#include <cstdlib>#include <iostream>#include <cstdlib>#inclu原创 2020-07-16 17:22:35 · 136 阅读 · 1 评论