![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数论
acmer_zp
这个作者很懒,什么都没留下…
展开
-
欧拉值的应用
UVA - 11426 别人的解释#include<cstdio>#include<cstring>#include<cmath>#include<queue>#include<iostream>#include<algorithm>#define LL long longusing namespace std;const int maxn=4e6+10;const int in原创 2017-04-14 16:07:03 · 832 阅读 · 0 评论 -
各种数论定理
小技巧 当算某个数的阶乘或者算很大的次方的时候,可以将数字转换为10^n的进制表示方法(比如1000进制或者10000进制),这样出来点的数字和原答案是一样的,只不过在一个数组的一个元素中多存了几位。约数个数定理 首先,n可以分解质因数:n=p1^a1×p2^a2×p3^a3*…*pk^ak, 由约数定义可知p1^a1的约数有:p1^0, p1^1, p1^2……p1^a1 ,共(a1+1)个原创 2017-07-27 09:13:41 · 1078 阅读 · 0 评论 -
母函数
hdu 1208 题意:给定n求将n进行整数划分的种类数。 思路:母函数。 什么是母函数呢?前面那个链接已经讲的很清楚了,不过有点理论化,可以看看这篇博客比较接地气。 我个人的理解就是将每一个东西能提供的价值看作是一个一元多项式的系数,然后将所有东西的一元多项式乘起来,然后系数就代表的就是组成系数的方案数有多少种。 普通型母函数#include<cstdio>#include<cstri原创 2017-10-02 11:08:32 · 496 阅读 · 0 评论 -
中国剩余定理
poj 2891 大佬博客#include<cstdio>#include<cstring>#include<cmath>#include<queue>#include<iostream>#include<algorithm>#define LL long longusing namespace std;const int maxn=4e6+10;const int inf=0x原创 2017-09-28 21:08:12 · 251 阅读 · 0 评论 -
一次同余式的求解(扩展欧几里得)
大佬的解释 题目链接#include<cstdio>#include<cstring>#include<cmath>#include<queue>#include<iostream>#include<algorithm>#define LL long longusing namespace std;const int maxn=4e6+10;const int inf=0x3f3原创 2017-04-14 16:02:08 · 3233 阅读 · 0 评论 -
巧解容斥
hdu 6053 题意:给定一个a序列,让求有多少种b序列满足,b序列的对应值小于等于a序列的值,且b序列的任意区间的数的gcd>=2; 思路:任意区间的数的gcd>=2则说明,b序列任意两个数不互素,这就可以枚举约数,假如约数为k,则a序列的每个数ai的贡献为ai/k向下取整个值,全部乘起来就是约数为k的b序列种类,,每种余数之和就是ans,但是会有重复的,后面容斥一下就好了。#include原创 2017-07-28 17:40:04 · 303 阅读 · 0 评论 -
高斯消元
#include<cstdio>#include<cstring>#include<ctime>#include<map>#include<iostream>#include<algorithm>#define LL long longusing namespace std;const int maxn=300;const int inf=0x3f3f3f3f;int equ,v原创 2017-08-12 11:21:59 · 285 阅读 · 0 评论 -
反素数
反素数定义 大佬博客 题目链接 给定一个n求因子个数为n的最小的值是多少。#include <cmath>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define LL long long#define ULL unsigned long longusing namespac原创 2017-08-04 18:38:13 · 1040 阅读 · 1 评论 -
NTT(快速数论变换)
大佬博客 和FFT一样都是快速求多项式乘法的,但是这个用的是整数,没有精度误差,运算起来也会更快。#include <cmath>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define LL long longusing namespace std;const int maxn原创 2017-08-04 16:20:15 · 478 阅读 · 0 评论 -
bitset(hdu 6085)
题意:给定两个数组a和b然后q次询问,输出ai%bi==k的个数的奇偶性。 思路:可以转化为给a数组每个都减去k求(ai-k)%bi==0的有多少个,又因为只有当bi>k时才会有结果所以可以预处理处所有的答案为k的结果最后O(1)输出就好了。枚举k然后从大到小枚举bi每次都将bi的倍数统计出来 然后每次就可以算出(ai-k)%bi==0的有多少个了,具体的看代码和注释。 这里有一个关于bits原创 2017-08-11 16:44:17 · 372 阅读 · 0 评论 -
lucas定理
题目链接 大佬博客还有扩展lucas 题意:给你n和m求C(n,m)。 C(n,m)=n!/(m!*(n-m)!); 当题目数据不是很大的时候可以打表,存一个阶乘表和逆元表,这样就可以直接计算了,但是当n和m很大的时候,就要用lucas定理了,前提是模数要是素数。 lucas定理:C(n,m)%p=C(n/p,m/p)*C(n%p,m%p)%p; 逆元:由费马小定理a ^ (p-1) =原创 2017-07-27 11:54:07 · 510 阅读 · 0 评论 -
FFT(快速傅立叶变换)
大佬博客 hdu 4609 题意:给定一个数组,问从其中选3个值能构成三角形的概率是多少。 思路:先求出选两个之和的情况,然后枚举选取的最长边,根据三角形的三边定理来求解。 选两个之和的情况及是,先将长度相同的统计起来,然后求这个数组的卷积,其值就是和为i的有多少个,也就是代码中的num数组。/*这里解释一下什么是两个数组的卷积,假如给定两个一元多项式,他们两个多项式的系数会成为两个数组原创 2016-12-04 17:19:48 · 891 阅读 · 0 评论 -
hdu 6143
题目链接 题意:给定m个不同的字符,然后每个人名有姓和名两部分,长度都为n。问这姓名不同且姓和名不能有相同字符的人最多有多少种。 思路:我们可以枚举姓中的字符个数当姓的字符个数定了之后,名的选法就可以选剩下的全部字母了,然后方法有(m−i)n(m-i)^n,当姓不同时,不管名一样不一样,这两个都不是同一个名字。当枚举姓的字符数的时,当字符数为2时,方法不能是2n2^n因为这样会有全选1中字符的情原创 2017-08-18 11:08:36 · 436 阅读 · 0 评论 -
莫比乌斯反演
大佬博客 hdu 1695 题意:让求从a~b区间和c~d区间有多少对的数的gcd为k,不能有重复的,gcd(2,3)和gcd(3,2)算重复的。 莫比乌斯函数应用的经典题,先求出所有的值然后再减去重复区间的值就好了。假设F(n)的值为gcd(x,y)==n(a<=x<=b,c<=y<=d)的有多少种。 G(n)代表n|gcd(x,y),(a<=x<=b,c<=y<=d)的有多少种。 由莫原创 2017-08-02 18:57:07 · 257 阅读 · 0 评论 -
pollard_rho(大数质因子分解)
poj 1811 题意:判断一个数是不是素数,是的话输出prime否则的话输出这个数的最小素因子。 大佬博客 hdu 4344 题意:给出一个长为n(n小于2^63)的管子,现在要在管子上做标记,每隔L个长度单位做一个标记,从管子头端开始,保证最后一次标记恰好在管子的尾端。让你找出有多少个这样的L(n>L),且他们之间两两互素,然后求出这些L的和最大值。 思路:首先可以想到L肯定是n的因子原创 2017-08-08 08:42:31 · 908 阅读 · 0 评论 -
欧拉函数
这里面有详细的解释/*线性筛O(n)时间复杂度内筛出maxn内欧拉函数值*/int m[maxn],phi[maxn],p[maxn],pt;//m[i]是i的最小素因数,p是素数表,pt是素数个数,phi[i]是i的欧拉函数int make(){ phi[1]=1; int k; for(int i=2;i<maxn;i++) { if(!m[原创 2017-08-07 18:01:30 · 260 阅读 · 0 评论 -
Miller-Rabin随机性素数测试算法
大佬博客 个人比较菜会用板子就好了。 送上例题hdu 2138 虽然暴力可以过但是还是用来学算法吧。#include<cstdio>#include<cstring>#include<ctime>#include<iostream>#include<algorithm>#define LL long longusing namespace std;const int maxn=1原创 2017-08-07 17:40:44 · 791 阅读 · 0 评论 -
容斥或欧拉(hdu 5514)
传送门 题意:给定n个青蛙,每一个青蛙的步长是ai,可以无限次跳,总共有m块石头,编号从0~m-1,围成一个圆,刚开始所有的青蛙都在0号石头上,青蛙跳到的石头都被占据,问被占据的所有的石头的编号和时多少。 思路:假如a是一只青蛙的步长,则a*k是它可能走的所有情况(k为正整数),a*k%m的所有值就是这只青蛙你能跳到的所有石头,但是这样根本就求不出来,(a*k+b*m)%m的值和上面的值是相同的原创 2017-10-12 20:17:46 · 360 阅读 · 0 评论