数论
文章平均质量分 56
我爱AI_AI爱我
不爱
展开
-
Olog(n)判断一个数是否为素数,最高判断到long long ——from kuangbin
//接口:if(Miller_Rabin(n) == true)//为真则为素数typedef long long LL;const int S=20;//随机算法判定次数,S越大,判错概率越小long long mult_mod(long long a,long long b,long long c){ a%=c; b%=c; long long ret=0;原创 2016-05-02 15:43:45 · 1045 阅读 · 0 评论 -
容斥原理(模板)
模板:递归版(好理解)其实打表是更慢的而且很可能根本打不下,因为打表实际上是依次枚举所有的方案,如果被除数较多,就无法枚举方案数了//容斥原理,结果存在sub中long long sub = 0;void dfs(int id,int deep,long long sum){ // cout<<sum<<endl; long long temp; for(i原创 2016-09-22 11:12:32 · 790 阅读 · 0 评论 -
模的情况下取log模板
//接口:log(a,b,n) log 以a为底,b的对数,余数是n。不存在返回-1LL log_mod (LL a,LL b,LL n){ LL m,v,e=1,i; m=(LL)sqrt(n+0.5); v=inv(get_inv(a,m),n); mapx; x[1]=0; for(i=1; i<m; i++) {原创 2016-10-12 23:06:37 · 367 阅读 · 0 评论 -
浮点数高斯消元的模板
//接口:Gauss();解存在x数组中。equ,var分别表示方程个数和变量的个数,(因为是变量 的个数不算常数的个数)要赋值。a就是行列式,其中常数是在方程右侧的符号。int const maxn = 2000;const double eps=1e-10;double a[maxn][maxn],x[maxn];int equ,var;int Gauss(){ int原创 2016-10-24 11:10:37 · 962 阅读 · 0 评论 -
区间素数筛模板
接口:qujiansushu(左端点,右端点)闭区间,返回区间中素数的个数bool f[100005];int qujiansushu(long long a,long long b){ int num = 0; int l = b - a;//将a到b转化为从0到b - a for(int i = 0 ; i < primeCount && prime[i原创 2016-10-10 16:52:07 · 422 阅读 · 0 评论 -
中国剩余定理(模板)
//接口china(n,s,m) s表示除数数组,m表示每个除数对应的余数的数组,n表示除数的个数void gcd(LL a,LL b,LL &d,LL &x,LL &y){ if(!b) { d = a; x = 1; y = 0; } else { gcd(b,a原创 2016-10-14 11:03:32 · 498 阅读 · 0 评论 -
数论基础(from -- kuangbin)
http://vjudge.net/contest/133425#overview原创 2016-10-14 11:48:15 · 1415 阅读 · 0 评论 -
求逆的模板(求逆本质上就是在mod 的状态下除一个数)
//接口:inv(a,n) a : 待求逆的数,n表示modvoid gcd(LL a,LL b,LL &d,LL &x,LL &y){ if(!b){d = a;x = 1;y = 0;} else {gcd(b,a% b,d,y,x); y-= x * (a / b);}}LL inv(LL a,LL n){ LL d,x,y; gcd(a,n,d,原创 2016-10-12 21:17:10 · 927 阅读 · 0 评论 -
数论扩展欧几里德基础习题(4.15)
题目:题目描述求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解。输入输入只有一行,包含两个正整数 a, b,用一个空格隔开。输出输出只有一行,包含一个正整数 x0,即最小正整数解。输入数据保证一定有解。样例输入3 10样例输出7思路:对题目中的式子进行变形可以得到ax - by = 1.可用扩展欧几里德算出一组x,y原创 2016-04-15 14:27:20 · 875 阅读 · 0 评论 -
判断一个10^18次约数的个数(利用miller_rabin)
//将这个式子分解为c*...只分解质因数到n开三次方,剩下的n如果等于1,c = 1.如果n是素数c = 2,如果c是素数的平方c= 3,如果是两个素数相乘c = 4#include #include #include #include #include #include #include #include #include #include #include #inc原创 2016-05-02 15:49:49 · 1168 阅读 · 0 评论 -
高斯消元(模板(kuangbin版))
#include#include#include#include#includeusing namespace std;const int MAXN=50;int a[MAXN][MAXN];//增广矩阵int x[MAXN];//解集bool free_x[MAXN];//标记是否是不确定的变元/*void Debug(void){ int i, j原创 2016-10-28 15:26:26 · 1374 阅读 · 1 评论 -
素数打表,复杂度(Onlogn)和O(n)(对与10^7来说线性快两倍) + 分解质因数
代码:接口: primeInit(100000);//打表的范围素数存在primeList中,个数为primeCountbool isPrime[maxn];LL primeList[maxn],primeCount = 0;void primeInit(LL n){ memset(isPrime,true,sizeof(isPrime));//初始化认为全部原创 2016-07-31 13:12:41 · 3107 阅读 · 0 评论 -
矩阵快速幂 (模板)
另斐波那契数列的矩阵为 1 1 1 0/*定义矩阵 Matrix A; A.clear(); /*改*/ A.n = A.m = 2; A.a[0][0] = 1; A.a[0][1] = 1; A.a[1][0] = 1; A.a[1][1] = 0;接口:Matrix res = Ma原创 2016-10-09 11:50:05 · 392 阅读 · 0 评论 -
求n很大时求,<= n的素数的个数(时间复杂度o(n ^ 2 / 3)模板
//Meisell-Lehmer#include#includeusing namespace std;#define LL long longconst int N = 5e6 + 2;bool np[N];int prime[N], pi[N];int getprime(){ int cnt = 0; np[0] = np[1] = true; pi[原创 2016-09-19 15:10:12 · 1252 阅读 · 0 评论 -
康托展开(求该排列是第几大的) 模板
//注意:当阶乘的n - 1超过12就要用long long//接口:kangtuo(s,n) s为排好的一种排列方式,返回值为这种排列是第几大的(从1开始)long long fac[20];void init(int n){ fac[0] = 1; long long result = 1; for(int i = 1;i <n; i ++) {原创 2016-05-06 11:09:17 · 291 阅读 · 0 评论 -
数学+思维(此题有多种做法,个人觉得思维更有趣)
http://acm.hdu.edu.cn/showproblem.php?pid=5776题意:T组数据,长度为n的数组,问数组中有没有一段的和能被m整除,输出yes,no解析:暴力必超时,考虑使用到m。用sum[i]表示从零开始到该点的sum和,通过两个sum相减可以得到一段区间的和。但此题不用这点,此题通过sum[i]对m求和,来降低复杂度。只需判断是否存在两个sum(取余后)是相等原创 2016-07-30 22:46:37 · 442 阅读 · 0 评论 -
判断是否为素数 + 分解质因数(利用了Miller_Rabin和素数筛选法)
http://acm.hdu.edu.cn/showproblem.php?pid=5778题意:T组数据,给x求y。y满足个条件1.与x差的绝对值最小 2.质因数分解每个元素恰好出现两次。x 解析:直接枚举sqrt(y),先判断开方后的这个数是否为素数(利用logn的算法),如果不是判断。开方后的这个数中分解质因数的因数每个元素最多出现一次,暴力枚举即可另:要注意题目中原创 2016-07-31 13:19:21 · 470 阅读 · 0 评论 -
快速幂(模板)
//x ^m次方,快速幂long long get_inv(LL x,LL m){ LL r,y; for(r = 1,y = m; y; x = x * x % mod,y >>= 1) { if(y % 2 == 1) r = r * x % mod; } return r;}原创 2016-08-15 15:33:21 · 266 阅读 · 0 评论 -
高斯消元(初识)
其实高斯消元解决的是n元方程组。形如10*x + 5 * y + 7 * z = 25 * x + 4 *y + 11 * z = 34 * x+ 3*y + 10 * z = 0利用线性代数的知识,首先将其中的系数提出:10 5 7 -25 4 11 -34 3 10 0然后对其进行化简得到最简化的行列式,其中矩阵的秩就是非零元的个数,对于其次方程组来说,n -原创 2016-08-16 15:17:04 · 228 阅读 · 0 评论 -
习题之高斯消元 + 分解质因数 + 快速幂
链接:http://acm.hdu.edu.cn/showproblem.php?pid=5833题意:n个数中任选m(m >= 1)个数相乘,使得乘积是一个平方数的方案数解析:首先可以对每个数分解质因数,显然,想要乘积是一个平方数,那么所有的质因子的个数都应该是偶数。(注:此题不能用dp,因为如果是这样的一组数 2 ,3, 6 那么当dp到六的时候,是需要乘以前两个的,最后还是要枚举全部原创 2016-08-16 15:49:30 · 365 阅读 · 0 评论 -
鸽巢原理(初识)(纯算法)
一.what?鸽巢原理(抽屉原理)若把n个物体放在n - 1个抽屉中,至少有一个抽屉中放了两个物体。它只能用于解决存在性问题?原创 2016-07-30 22:35:45 · 12811 阅读 · 0 评论 -
dp(记忆化搜索) + 概率论(全概率)
http://acm.hust.edu.cn/vjudge/problem/51198题意:多组数据,n = 9,m = 4。相当于n堆纸牌,m = 4位每堆纸牌的最上面。每次从所有纸牌的最上面,取前一个字符相当的两张牌,求最后都能取完的概率是多少。解析:直接暴搜,如果都是相等的,那就相当于是暴搜2^36次,肯定是不对的。记录所有纸牌,每堆纸牌的个数,作为状态。当前状态dp[i]等于所有子原创 2016-08-17 16:10:13 · 441 阅读 · 0 评论 -
又见余数
链接:http://exam.upc.edu.cn/problem.php?id=1819题意:n头奶牛,各有一个编号a[i]。奶牛会自己寻找房间号为a[i] % k。k个房间,房间号为0……k-1.保证没有任何两个奶牛住在一个房间中时,至少需要多少个房间。解析:题解的关键就是如果任意两个点的差是l,或者是l的倍数。那么这两个点余l一定是相等的。利用类似素数筛选法的方法。先对奶牛的原创 2016-08-13 13:15:51 · 301 阅读 · 0 评论 -
取余的特点(+同余定理)
1.加法乘法和取模没有顺序2.如果两个数对m取余相等。那么这两个数相减后,该数被m整除。公式:(a + b) % n = ((a % n ) + (b % n)) % nab % n = (a % n) (b % n) % n大整数取模1234 = ((1*10 + 2) * 10 + 3)*10 + 4) = ((1*10 + 2)%m * 10 + 3)%m*10 +原创 2016-08-15 13:47:18 · 2365 阅读 · 0 评论 -
欧拉函数模板
//接口phi_table(int n)求从1到小于等于n的每个点i,小于i且与i互素的个数int const maxn = 1100000;int phi[maxn + 5];void phi_table(int n){ for(int i = 2; i <= n; i ++) phi[i] = 0; phi[1] = 0; for(int i原创 2016-10-13 16:41:40 · 354 阅读 · 0 评论