![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数论
文章平均质量分 66
Alex Su (*^▽^*)
清华大学计算机系硕士在读 ACM-ICPC银牌 CCPC银牌 蓝桥杯国一 天梯赛国一 CSP全国前50
展开
-
caioj 1152 快速求模 (快速幂)
(1)开long long,不然中间结果会溢出(2)注意一开始的初始化,保险一点。#include<cstdio>#include<cctype>#include<algorithm>#define REP(i, a, b) for(int i = (a); i < (b); i++)#define _for(i, a, b) for(i...原创 2018-09-15 16:12:38 · 102 阅读 · 0 评论 -
洛谷 P1372 又是毕业季I
设答案为d则这k个数是d, 2d, 3d, 4d……kd有 kd <= n即d <= n / k要d最大,输出n / k就好了。这种设答案然后推关系的方法很常见#include<cstdio>#define REP(i, a, b) for(int i = (a); i < (b); i++)#define _for(i, a, b) f...原创 2018-09-18 16:50:56 · 116 阅读 · 0 评论 -
洛谷 P1338 末日的传说 (字典序 + 逆序对)
这道题需要对排列有深刻的理解和认识给出逆序对的个数,求改逆序对个数的字典序最小的排列那么既然是最小,那么一开始一段肯定是升序,一直到某个数后才开始改变即1 2 3…… n-1 n a b c d……类似这样那么我们要求出这个n在哪里要字典序最小,就需要1到n这一段最长也就是说在a, b, c, d后面有尽量多的逆序对当数列为n n-1 n-2 ……1时逆序对最多逆序对个数就是n ...原创 2018-09-18 18:35:21 · 242 阅读 · 0 评论 -
caioj 1153 扩展欧几里德算法(解不定方程)
模板题注意exgcd函数要稍微记一下#include<cstdio>#include<cctype>#include<algorithm>#define REP(i, a, b) for(int i = (a); i < (b); i++)#define _for(i, a, b) for(int i = (a); i <= (b)...原创 2018-09-15 15:47:02 · 108 阅读 · 0 评论 -
数论模板
#define REP(i, a, b) for(int i = (a); i < (b); i++)#define _for(i, a, b) for(int i = (a); i <= (b); i++) 欧几里德算法(辗转相除法)(1)可以用来求最大公约数和最小公倍数(2)注意题目的数据是否在int内,中间结果有溢出的可能, 根据情况开long long(...原创 2018-06-28 18:07:29 · 238 阅读 · 0 评论 -
洛谷 P1582 倒水 (二进制)
这道题实际上是考二进制很容易看出杯子水量一定是2的i次方所以n杯水最后剩下的水一定是n用二进制表示中1的个数所以就枚举n来求什么时候1的个数小于k那么这里有个优化,不然会超时因为每次加的目的是要让1的个数变少,也就是要进位所以每次加上的是lowbit(n)#include<cstdio>#define REP(i, a, b) for(int i = (a...原创 2018-09-20 18:52:03 · 131 阅读 · 0 评论 -
洛谷 P2152 [SDOI2009]SuperGCD (高精度)
这道题直接写了我两个多小时……主要是写高精度的时候还存在着一些小毛病,调了很久在输入这一块卡了很久。然后注意这里用while的形式写,不然会炸最后即使我已经是用的万进制了,但是交上去还是有两个点超时然后就开始漫长的改进,一直过不了那两个点。然后突然发现,貌似这道题没有涉及到乘法。那不就可以直接开10的九次方为一位了(10的9次方是int的最大数量级)我交上去之后就A...原创 2018-09-21 23:31:30 · 232 阅读 · 0 评论 -
洛谷 P1414 又是毕业季II (多个数的最大公因数)
这道题其实不难,但是我想复杂了我想的是把每个数质因数分解,然后每次就枚举每个质因数来求最小公倍数。然后想了想这样复杂度将会非常的大,肯定超时然后看了题解发现不需要质因数分解,直接存因数的个数就好了c[i]表示i这个因数出现的次数。然后因为当k越小的时候答案越大(严格来说是大于等于),这是显而易见的,当数少了之后对最大公因数的限制就越少。所以我们可以把因数从大到小枚举,来求答案...原创 2018-09-22 09:51:34 · 157 阅读 · 0 评论 -
洛谷 P1134 阶乘问题
一开始只保留最后一位,交上去29#include<cstdio>#include<cmath>#include<algorithm>#define REP(i, a, b) for(int i = (a); i < (b); i++)#define _for(i, a, b) for(int i = (a); i <= (b); i++...原创 2018-09-22 10:25:46 · 120 阅读 · 0 评论 -
洛谷 P1313 计算系数 (二项式定理)
这道题正好复习了二项式定理所以答案就是a^n * b^m * c(n, k)然后注意一些细节我一开始写组合数只写一行的组合数即c[0] = 1; c[i] = c[i-1] * (n - i + 1) / i但是因为要去模,同时式子里面有除法,所以不能用这种方式必须从头来推然后注意组合数推要从0开始#include<cstdio>#include<cma...原创 2018-09-22 14:19:16 · 194 阅读 · 0 评论 -
洛谷 P3390 【模板】矩阵快速幂
矩阵乘法百度上已经讲得很清楚了https://baike.baidu.com/item/%E7%9F%A9%E9%98%B5%E4%B9%98%E6%B3%95/5446029?fr=aladdin这个模板题记得全部都要开long long#include<cstdio>#include<cstring>#define REP(i, a, b) for(i...原创 2018-09-22 15:13:43 · 220 阅读 · 0 评论 -
洛谷 P1939 【模板】矩阵加速(数列)
感觉矩阵乘法真的牛逼关于怎么构造矩阵,可以看这篇博客,自己先不看答案构造一遍看自己哪里不一样,做一遍就差不多会构造了矩阵构造这种矩阵快速可以优化一些比较简单的递推式构造出一个中间矩阵,然后先做中间矩阵的快速幂然后乘上初始矩阵就好了#include<cstdio>#include<cstring>#define REP(i, a, b) for(...原创 2018-09-22 16:19:21 · 130 阅读 · 0 评论 -
洛谷 P1306 斐波那契公约数 (神奇结论+矩阵快速幂)
有这个迷之结论如果是比赛的话可能就打表找规律了然后就是用矩阵快速幂了矩阵为1 11 0很好推。然后注意矩阵快速幂的题范围小于等于矩阵长度的时候要特判一下同时保留后8位是模1e8, 不是1e9#include<cstdio>#include<cstring>#define REP(i, a, b) for(int i = (a);...原创 2018-09-22 16:34:58 · 156 阅读 · 0 评论 -
组合数学题集
bzoj 1008逆向思维。一共有m^n种状态我们考虑不越狱的情况第一个人有m种选择,后面的所有人均是m-1种选择那么方案数就是 m^n - m * (m - 1) ^ (n - 1) 快速幂就好其实不难,自己不要怕,心理不要有障碍#include<bits/stdc++.h>#define REP(i, a, b) for(register int i =...原创 2018-10-12 19:56:15 · 940 阅读 · 0 评论 -
洛谷 P1865 A % B Problem
水题水题#include<cstdio>#include<vector>#include<cstring>#define _for(i, a, b) for(int i = (a); i <= (b); i++)#define REP(i, a, b) for(int i = (a); i < (b); i++)using names...原创 2018-09-17 16:39:11 · 126 阅读 · 0 评论 -
洛谷 P1029 最大公约数和最小公倍数问题
有两种做法一种是gcd与lcm相乘后就是两个数的乘积,枚举第一个数,算出第二数,看最大公约数是不是题目给的。第二种就lcm/gcd的答案为两个互质的数相乘。然后就枚举有多少组互质的数相乘等于lcm / gcd就ok了然后又小优化,可以只枚举到根号,然后结果乘以2就行了。#include<cstdio>#define _for(i, a, b) for(int i =...原创 2018-09-17 16:29:46 · 270 阅读 · 0 评论 -
caioj 1157 线性筛选素数
注意这道题开得非常大,有2*1e7自己可以养成一种习惯,如果数据是很容易的话,可以自己手动输入极限数据来测试自己的程序#include<cstdio>#include<algorithm>#include<cstring>#include<vector>#define REP(i, a, b) for(int i = (a); i ...原创 2018-09-15 16:42:38 · 145 阅读 · 0 评论 -
caioj 1154 同余方程(模版)
求x的最小正整数解,使得ax=b(mod m)那么显然ax - b = m * yax - my = b那么就套入Ax+By = K的不定方程中,然后用exgcd求解即可但这道题求最大正整数解,对于一组解,有这样一个推论x = x0 +k*(b/gcd(a,b)) y = y0-k*(a/gcd(a,b)) k为任意正整数 可以带入方程中算一下,依然满足方程。那么也...原创 2018-09-16 10:12:46 · 181 阅读 · 0 评论 -
caioj 1155 同余方程组(模版)
第一步,和同余方程一样,转化一下 两式相减得这就转化为了求不定方程,用exgcd求出x,要化成最小正整数解,避免溢出然后可以求出P出来。这个时候要把前两个式子转化成一个式子设求出来的是P’则有 这个就转化成了新的m1和b1然后就一直求下去即可最终b1就是答案#include<bits/stdc++.h>#define REP(...原创 2018-09-16 10:50:38 · 536 阅读 · 0 评论 -
caioj 1158 欧拉函数
直接套模板,这道题貌似单独求还快一些解法一#include<cstdio>#include<cctype>#define REP(i, a, b) for(int i = (a); i < (b); i++) #define _for(i, a, b) for(int i = (a); i <= (b); i++) using namespac...原创 2018-09-16 11:16:19 · 102 阅读 · 0 评论 -
poj1284 && caioj 1159 欧拉函数1:原根
这道题不知道这个定理很难做出来。除非暴力找规律。我原本找的时候出了问题暴力找出的从13及以上的答案就有问题了因为13的12次方会溢出那么该怎么做?快速幂派上用场。把前几个素数的答案找出来。然后因为原根的一个条件是与p互质,所以可以把欧拉函数的值求出来尝试一下打印出来,就可以发现规律答案就是phi(p-1) 暴力找答案代码#include&l...原创 2018-09-16 12:15:26 · 127 阅读 · 0 评论 -
caioj 1161 欧拉函数3:可见点数
(x, y)被看到仅当x与y互质由此联想到欧拉函数x=y是1个点,然后把正方形分成两半,一边是φ(n)所以答案是2*∑φ(n)+1#include<cstdio>#include<cctype>#define REP(i, a, b) for(int i = (a); i < (b); i++) #define _for(i, a, b) fo...原创 2018-09-16 15:13:02 · 152 阅读 · 0 评论 -
caioj 1204 Catalan数(模板)
题目中对卡特兰数的总结很不错以下copy自题目 Catalan数列:1,1,2,5,14,42,(前面几个要背)即 h(0)=1,h(1)=1,h(2)=2,h(3)=5...公式:h(n)=C(n,2n)/(n+1) 注:C(3,5)表示组合数5个数选3个的方案数递推公式:h(n)=h(n-1)*(4*n-2)/(n+1);是不是很简单呀?下面的题也是Catalan数...原创 2018-09-17 10:08:21 · 114 阅读 · 0 评论 -
51nod 1079 中国剩余定理模板
中国剩余定理就是同余方程组除数为质数的特殊情况我直接用同余方程组解了。记得exgcd后x要更新还有先更新b1再更新m1,顺序不能错!!(不然会影响到b1的更新)#include<cstdio>#include<cctype>#define REP(i, a, b) for(int i = (a); i < (b); i++)#define _f...原创 2018-09-17 10:42:59 · 124 阅读 · 0 评论 -
洛谷 P1088 火星人 (全排列)
直接调用next_permutation即可,向前的话可以调用prev_permutation#include<cstdio>#include<cctype>#include<algorithm>#define REP(i, a, b) for(int i = (a); i < (b); i++)#define _for(i, a, b) f...原创 2018-09-17 11:23:22 · 301 阅读 · 0 评论 -
洛谷 P1045 麦森数 (快速幂+高精度+算位数骚操作)
这道题太精彩了!我一开始想直接一波暴力算,然后叫上去只有50分,50分超时然后我改成万位制提高运算效率,还是只有50分然后我丧心病狂开long long用10的10次方作为一位,也就是100亿进制去做,然后交上去多过了一个点,60分 附上丧心病狂的代码#include<cstdio>#include<cctype>#include<a...原创 2018-09-17 14:50:56 · 160 阅读 · 0 评论 -
洛谷 P1403 [AHOI2005]约数研究
怎么会有这么水的省选题一定是个签到题。好歹它也是个省选题,独立做出要纪念一下很容易发现在1~n中,i的因子数是n / i那就枚举每一个i然后加起来就OK了#include<cstdio>#define _for(i, a, b) for(int i = (a); i <= (b); i++)using namespace std;int main()...原创 2018-09-17 15:09:01 · 97 阅读 · 0 评论 -
P1017 进制转换 (负进制转换)
和平常的转化差不多加多一步如果余数 < 0, 那么余数减去除数(此时除数是负),商数加1 #include<cstdio>#define _for(i, a, b) for(int i = (a); i <= (b); i++)using namespace std;void cal(int n, int m){ if(n == 0) return...原创 2018-09-17 15:53:47 · 376 阅读 · 0 评论 -
洛谷 P1147 连续自然数和 (滑动窗口)
维护一个滑动窗口即可注意不能有m到m的区间,因为区间长度要大于1#include<cstdio>#define _for(i, a, b) for(int i = (a); i <= (b); i++)using namespace std;int main(){ int m, sum = 0, st = 1; scanf("%d", &m); ...原创 2018-09-17 16:15:43 · 132 阅读 · 0 评论 -
同余问题题集
青蛙的约会(解不定方程)设走了t步,则第一只青蛙跳了,第二只是则有那么有所以可以列出不定方程 其中t和k为未知数。用拓展欧几里得求解。求完之后判断一下有没有解然后x乘上K /gcd就是真正的解然后b /gcd可以作为模,把x调整成最小正整数解最后注意开long long,数论题大多都要开long long#include<bits/stdc++.h&...原创 2018-10-12 20:29:25 · 2526 阅读 · 0 评论