数论
数论
王江奎
这个作者很懒,什么都没留下…
展开
-
Pollar Rho算法
原本是想把这个算法搞懂的,然后在网上看了又看,觉得,还是有时间再来看吧,我错了。看到了一个大佬的博客,顺带收集一下板子这个板子可以求大数的最大的因子。#define LL long longbool IsPrime(LL);//返回素性测试结果LL GCD(LL,LL);//返回两个数的GCDLL Mix(LL,LL,LL);//返回两个数在模运算下的乘积void MaxFacto...转载 2019-10-28 18:17:20 · 704 阅读 · 0 评论 -
HDU3430-扩展中国剩余定理
刚开始一直把题意看错了。。。体测完智商急剧下降正确理解题意以后自己写一直wa,而且并不知道是哪里的问题,在网上看了一下其他人写的改了改自己的就过了,可是之前的还是不知道为什么不对。题意大概就是有一个置换群,问运算多少次会出现给定的样子。我们可以求出每个元素需要运算多少次到达给定的样子,记为r[i]r[i]r[i],再计算出运算多少次是一个循环,记为m[i]m[i]m[i],则最后的次数x为x%...原创 2019-11-07 22:05:52 · 159 阅读 · 0 评论 -
BZOJ2818-莫比乌斯反演/欧拉函数
这道题之前没有看数论函数的时候搞懂了,想到直接用欧拉函数做,现在再来看第一个想法就是这不是莫比乌斯反演嘛.但还是能用简单数论知识直接做出来的还是尽量做简单一点.两种方法想到后都写的差不多对了,都爆long long 了.万恶的long long .实在是烦.切记切记,只要是乘积,或者是累加的地方都要注意!!!用欧拉函数做的话思路是:题目要求的是数对gcd(x,y)为素数的的个数,那么对于每个...原创 2019-11-06 17:20:09 · 235 阅读 · 0 评论 -
HDU1999不可摸数-暴力打表
看到这约数和第一反应是约数和函数,然后仔细一看不是正经的约数和函数,就去推去了,然后推的有点小复杂。(数论函数那部分做多了)然后观察也没有用到什么数论部分的特殊知识啊,难不成真的要暴力?大概分析了一下,应该要暴力1e6级别的。因为一个数如果是合数,则至少有两个非平凡因子,这两个非平凡因子的和由均值不等式最小为2sqrt(n)<=1000,所以我们大概要暴力(500)2=250000.然...原创 2019-11-04 19:02:02 · 150 阅读 · 0 评论 -
BZOJ3930-莫比乌斯反演+杜教筛
题目的意思很简单,求给定区间内的gcd=k的个数,这应该是传统的莫比乌斯反演了。有两种思路,一种是直接将里面变成gcd=1,然后里面看作元函数用莫比乌斯函数和恒等函数展开,然后改变求和顺序。还有一种是构造两个函数,一个是f(x)表示x|gcd的数对个数,一个是g(x)表示x=gcd的数对个数。则f(x)等于g(d)求和,其中x|d,然后再用莫比乌斯反演得到g(x)的表达式,为了缩小求值范围我们...原创 2019-11-04 17:20:34 · 209 阅读 · 0 评论 -
HDU6428-Calculate-数论函数
并不知道为什么同样一份代码早上超时下午就A了…好像数据是随机的?做的第一道不是简单板题的数论函数题.果然做不出来…在网上研究了好久,才算稍微研究明白.看到了两种推导的思路.(写了半天发现讲起来好麻烦,有时间再来更新)#include<cstdio>#include<cstring>#include<algorithm>#define LL long ...原创 2019-11-03 15:05:49 · 222 阅读 · 0 评论 -
HDU1573-模线性方程
模线性方程的模板题。(卡了一会,发现读入弄错了)#include<cstdio>#include<cstring>#include<algorithm>#include<climits>#include<cmath>#include<cstdlib>#include<ctime>#include&l...原创 2019-11-02 17:14:28 · 159 阅读 · 0 评论 -
BZOJ3884上帝与集合的正确用法-欧拉函数
刚开始我想的是欧拉降幂,可是觉得复杂度还是挺高的就去找了一下题解。思路大方向没有问题,仍然是使用欧拉函数降低指数然后递归处理。但是不是简单的使用欧拉降幂而是应该对模数p稍微处理一下。因为底数已经确定为2,所以我们可以将p写成p=2k*q,q为奇数的形式,则22的无穷次方%p=2k(22的无穷次方-k%q)这样可以直接对新的指数直接模q的欧拉函数值进行处理,因为每次q为奇数,q的欧拉函数值一定...原创 2019-11-02 15:31:44 · 152 阅读 · 0 评论 -
欧拉降幂
我们记f(n)为n的欧拉函数值,则当B>f©时,AB%C=AB%f©+f©%C,这里A,C可能不互质。很好用,证明很复杂,等有时间回来学习一下。原创 2019-11-02 11:36:00 · 115 阅读 · 0 评论 -
SPOJ-VLATTICE Visible Lattice Points-莫比乌斯反演
需要将问题分解一下。我们需要求的是这个立方体从(0,0,0)能看到的点的个数。可是在三个含有(0,0,0)的面上我们没有办法和其他的一起进行分析(因为含有坐标是0,而我们的数论工具都是从1开始的),所以我们可以将那三个面分开考虑,剩下的就是一个立方体,这个立方体中能看到的点的坐标就是gcd(x,y,z)=1,然后用莫比乌斯反演进行处理。对于那三个面,首先是三个坐标轴上我们只能看到三个点,剩下的每...原创 2019-11-01 20:05:53 · 149 阅读 · 0 评论 -
BZOJ-2005能量采集-数论函数
很入门的数论函数题目。我还是wa了一发(爆long long 了)对于每个位置x,y,在他们和能量采集器中间的植物为gcd(x,y)-1,【在他们之间说明斜率相同,而和他们斜率相同的就是所有gcd(x/gcd(x,y),y/gcd(x,y))=1的并且比他们小的,就是gcd(x,y)-1个】,所以x,y位置损失的能量为2gcd(x,y)-1,然后对所有的gcd求和,问题就转换成了如何快速的对该区...原创 2019-11-01 19:12:22 · 179 阅读 · 0 评论 -
HYSBZ - 1101——莫比乌斯反演
【题目描述】HYSBZ - 1101【题目分析】昨天测试出了一道差不多的题目,我只能想到暴力,各种优化,最后都是运行了好久TLE,最后才知道要用到莫比乌斯反演,就想着今天研究一下,得出的结论就是,我可能研究不来。。。要用到数论的知识,我连人家的基本的定义都理解不了,更不要说证明了。现在只能说学会用吧,我知道这里的莫比乌斯反演可以快速求出[1,n]和[1,m]中所有互质的数字的数目,当作板...原创 2019-08-09 09:49:21 · 163 阅读 · 0 评论 -
HDU2683——欧拉完全数
题目要求符合等式的数,我们首先要做的就是分析这个数:对于这个等式,我们可能什么都看不出来,左边很难化简的样子,所以我们就要想到通过变化怎么样把右边化成和左边形式差不多的样子。结合组合数我们想到二项式定理,展开得到左边等于右边的话我们可以得到g(n)=2*n,因为n本身为自身的因子,那么n的小于自身的因子之和为自身说明n为完全数。所以问题转换为如何求完全数。由数论知识得任何一个完全数都可...原创 2019-10-30 20:45:03 · 322 阅读 · 0 评论 -
费马大定理
当n>=3时方程 xn+yn=zn没有正整数解结论很简洁,刚才看了一下证明的历史,我勒个去。。。。原创 2019-10-28 12:28:59 · 314 阅读 · 0 评论 -
本原勾股数组
勾股数我们都很熟悉,a2+b2=c2,可是如何快速找到所有的勾股数组呢?本原勾股数组a2+b2=c2性质:1. a,b奇偶不同,c一定是奇数2. 若b为偶数,c-b和c+b一定是完全平方数3. 设t>s>=1,且均为奇数,则a=s∗t,b=(t∗t−s∗s)/2,c=(t∗t+s∗s)/2a=s*t,b=(t *t-s *s)/2,c=(t *t+s *s)/2a=s∗t,b=...原创 2019-10-28 12:11:11 · 556 阅读 · 0 评论 -
卡特兰数
卡特兰数的引入与n边形分成三角形的个数有关:我们令f[n]表示n边形可以分成的三角形的个数,特殊的,令f[2]=1我们考虑以顶点1顶点的一个三角形,假设用的是n边形的k-k+1边,那么这种情况的方案数就是f[k]∗f[n−k+1]f[k]*f[n-k+1]f[k]∗f[n−k+1],这个边可以变化,从1-2到n-1-n,所以f[n]=f[2]∗f[n−1]+f[3]∗f[n−2]+...+f...原创 2019-10-24 23:14:28 · 392 阅读 · 0 评论 -
逆元
在模p的群中ax=1(mod p),则称x为a的逆.在这种运算中,a/b=a*b-1(mod p)逆元存在的条件是gcd(a,p)=1这里简单证明一下,假设gdc(a,p)=d ax+bp=t,则t%d=0,显然t!=1,即ax!=1,a没有逆元一般情况下我们可以用扩展欧几里得求某个元素的逆元:ax=1(mod p)即ax+bp=1求得的x=(x%p+p)%p就是一个逆元啦.求一个逆元的...原创 2019-10-23 14:59:03 · 1154 阅读 · 0 评论 -
BZOJ - 2186 欧拉函数
题目的意思大概是求1~N!中和M!互质的数的个数因为对欧拉函数理解不够深刻所以我是分析得到结果的:当N<=M的时候显然符合要求的数的个数为0;当N>M的时候我们要求的是1~N!中不含1 ~M的素因子的的数的个数,结合欧拉函数的推导过程(容斥原理)假设N!在1 ~ M中含有k个素因子,设n=N!,那么符合要求的数的个数就是n−n/p1−n/p2−...−n/pk+n/p1p2+...原创 2019-10-22 23:17:34 · 208 阅读 · 0 评论 -
POJ 2142——扩展欧几里得
题目是很裸的扩展欧几里得,但是对x,y有限制条件,要求所有x,y中abs(x)+abs(y)最小,在这个条件下要求abs(a* x)+abs(b* y)最小显然我们需要用扩展欧几里得求得一组解,问题在于如何处理这组解以得到符合条件的值。我是这样处理的:最小的两组解分别为x为最小非负整数和y为最小非负整数的情况。然后就过了,可是我想证明的时候证明了好久都没有证明成功。在网上看其他人的题解找到一种...原创 2019-10-21 18:01:58 · 203 阅读 · 0 评论 -
POJ 1061扩展欧几里得
扩展欧几里得的模板题,需要注意的是为了得到一个最小正数解我们要使ax+by=c中的a,b都是正数#include<cstdio>#include<cstring>#include<cstdlib>#include<algorithm>#include<iostream>#include<cmath>#includ...原创 2019-10-20 21:28:24 · 110 阅读 · 0 评论 -
UVa11426——欧拉函数
发现对于gcd问题要多和欧拉函数联系在一起,虽然有时候并不是互质,但是我们知道有多少互质的然后根据互质的数目就能解决很多个gcd的问题对于这道题目,题目要求的是所有数对的gcd的和,直接思考的话有难度。但是我们如果联想到欧拉函数问题就解决了许多。我们对于每个数都考虑他的欧拉函数值,即有phi[x]个数和x互质,设gcd(x,i)=1,那么gcd(tx,ti)=t,因为我们考虑的是所有互质的数,...原创 2019-10-20 21:04:47 · 167 阅读 · 0 评论 -
快速幂
主要用到二分的思想ll mult(ll a, ll b, ll p) { a %= p; b %= p; ll res = 0, tmp = a; while(b) { if (b & 1) { res += tmp; if (res > p) res -= p; } ...原创 2019-10-20 12:28:36 · 105 阅读 · 0 评论 -
POJ 3696 欧拉函数+快速幂
题目的意思大概就是问是否存在一串全是8的数字是L的倍数直接想没有什么想法,要想到用简洁的形式将这个数字表示出来,对于每一位都是8的数字我们可以用X=8*(10k-1)/9的形式表示出来,那么题目的意思就是求X使L|X,我们先处理一下8和L,即除去他们的最大公约数,然后就是L’|(10k-1)/9,即就是10k-1|9L’我们用L’'表示9L’问题就转化成了要求10k-1%L’’==0,10k...原创 2019-10-20 00:01:16 · 251 阅读 · 0 评论 -
POJ 1006 Biorhythms
中国剩余定理的模板题只是有一个问题就是求出来X=k*M+R中的R比给定的日期还大,但是如果负数的整除就不是向下取整了,为了解决这个问题,我们将R减小M,这样总是正的,求出来的就没有什么问题。#include <iostream>#include<cstdio>using namespace std;#include <algorithm>#inclu...原创 2019-10-19 16:07:47 · 101 阅读 · 0 评论 -
模线性方程(中国剩余定理+扩展中国剩余定理)
已知一系列除数和模数,求最小的满足条件的数我们考虑两个方程的情况x%M=R x=k1∗M+Rx=k1 * M+Rx=k1∗M+Rx%m=r x=k2∗m+rx=k2 * m+rx=k2∗m+r所以k1∗M+R=k2∗m+rk1 * M+R=k2 * m+rk1∗M+R=k2∗m+r即k1∗M−k2∗m=r−Rk1 * M-k2 * m=r-Rk1∗M−k2∗m=r−R我们可以用扩展欧...原创 2019-10-16 16:24:17 · 173 阅读 · 0 评论 -
约瑟夫问题
n个人编号为0…n-1围成一个圈,从0开始报数,每经过k个人那个人就退出这个圈不再报数,问最后留下来的人的编号.朴素的做法当然是模拟,但是n,k的值一旦变得比较大的时候就难以解决问题.我们考虑归纳的解决问题当只有一个人的时候答案显然为0,假设我们已知n-1个人的时候答案为ans[n-1],那么当人数为n时显然的,我们首先得选一个人出去,这个人是(k-1)%n,然后我们从下一个起点(k%n...原创 2019-10-16 15:14:29 · 373 阅读 · 0 评论 -
扩展欧几里得算法
对于a∗x+b∗y=ca*x+b*y=ca∗x+b∗y=c,这样一个二元一次方程组,我们想要得到他的一组解可以用扩展欧几里得算法,参数列表的a,b,x,y就是方程中的a,b,x,y,d计算出来是gcd(a,b)。算法求出来的是a∗x+b∗y=gcd(a,ba*x+b*y=gcd(a,ba∗x+b∗y=gcd(a,b的一组解,解系可以表示为X=x+b/d∗k,Y=y−a/d∗kX=x+b/d*k,...原创 2019-10-15 23:10:27 · 180 阅读 · 0 评论 -
欧拉函数
在一个叫做hihoCoderhihoCoderhihoCoder的网站系统学习了一下数论的知识,这里总结一下.欧拉函数f(n)f(n)f(n)求1~n-1中和n互质的数的个数先上板子 bool check[MAXN]; int prime[MAXN]; int phi[MAXN]; int tot;void creat_phi(){ tot=0; for(int i=2;i&...原创 2019-10-14 22:49:10 · 197 阅读 · 0 评论 -
UVa11582
一个数学问题,一旦出现循环确定循环节以后就能解决问题啦.加上一个快速幂取模.需要注意的是数据范围是264,所以必须用unsigned long long才能解决问题.觉得板子还是要会自己写,否则不同的题目具体有一些小的改变就会束手无策.还有就是发现如果每次初始化数组的话就会超时,所以需要注意在不必要 的时候或者可以通过简单赋值的时候不要用memset进行初始化,挺耗时间.看其他人为了避免超...原创 2019-09-25 14:22:37 · 245 阅读 · 0 评论 -
UVa12169
我们可以暴力枚举a,然后通过x1和x3确定b的值,然后确定其他的数字,一旦出现错误就放弃这组解。关键问题就在于如何通过a,x1,x3确定b的值x2=(x1a+b)%Mx3=(x2a+b)%M=((x1a+b)%Ma+b)%Mx3-kM=x1a%Ma%M+ba%M+b我们不妨设b<Mb(a+1)+kM=x3-x1a*a我们想要求出b,即就是求出这个二元一次方程的一组解,这时候用扩...原创 2019-09-25 17:01:54 · 250 阅读 · 0 评论 -
UVa10375
题目描述很简单,就是求两个组合数的商.可是数字范围很大,肯定不能直接计算.因此要用到唯一分解定理,即将结果全部表示为素因子的幂的形式.#include<cstdio>#include<cstring>#include<algorithm>#include<climits>#include<cctype>#include<...原创 2019-09-28 13:58:09 · 156 阅读 · 0 评论 -
UVa10791
我们可以先用唯一分解定理将这个数字分解成素因子幂的乘积,为了得到最小的和,我们可以发现:每个 素因子的幂单独分开的和是最小的。先说明每个素因子都是以出现的最大的次数出现。因为最小公倍数一定,因此至少有一个数字的这个素因子的幂等于最大的次数,如果不一次取完,另一个和其他的因子的乘积肯定没有1和其他因子的乘积小。再说明每个素因子都是分开的:每个素因子的幂都是大于2的,都分开的话相当于每个素因子的幂...原创 2019-09-28 14:47:38 · 177 阅读 · 0 评论 -
UVa1635
我们很容易发现最后每一项的系数就是二项式展开,余数和m没有关系就意味着可以被m整除,因此我们就需要求出每一个二项式的系数。但是数据实在太大我们根据唯一分解定理将m和系数都进行分解,然后比较因子的幂。二项式的计算我们可以根据杨辉三角递推,可是这个实在是太大了,递推很慢。所以我们要知道二项式的另一个递推式:C(n,k)=C(n,k-1)*(n-k+1)/k,递推出需要的素数的分解式。我们发现判断...原创 2019-09-28 16:50:42 · 169 阅读 · 0 评论 -
UVa10820
实质上就是求欧拉函数值书上有个板子挺好,也不难理解。#include<cstdio>#include<cstring>#include<algorithm>#include<climits>#include<cctype>#include<queue>#include<set>using nam...原创 2019-09-28 17:15:38 · 125 阅读 · 0 评论 -
CF Gym102059 H. Fractions
题目要求找到给定区间的化简后分子分母的和小于1000的数字的个数我的想法是先找到所有的满足要求的最简分数(总数不超过1e6,而且远小于),然后对询问查找每个最简分数出现的次数.#include<cstdio>#include<cstring>#include<algorithm>#include<climits>#include<c...原创 2019-10-03 16:53:53 · 354 阅读 · 0 评论 -
CF Gym100917 C
要找到和为给定值的所有的等比数列.1肯定是要特判一下.我的想法是先找到所有等比为1的,等比为1就是将这个数分为相同的一些数,总共就是这个数的所有约数个数减一(有一个约数为1,题目要求至少分成两个数).对于其他的等比不为1 的,用等比数列的求和公式暴力一发就行了.#include<cstdio>#include<cstring>#include<cmath&...原创 2019-10-03 17:00:42 · 153 阅读 · 0 评论 -
HDU5391威尔逊定理
威尔逊定理 当且仅当p为素数,p | (p-1)!+1若p为合数,则p=a*b;如果a!=b,那么p|(p-1)!,如果a=b,如果p为4,那么p|(p-1)!=2,如果p大于4,那么sqrt§和sqrt(2q)肯定属于(p-1)!中,可以整除#include<cstdio>#include<cstring>#include<algorithm>#i...原创 2019-10-07 17:11:29 · 178 阅读 · 0 评论 -
2018南京区域赛 J-Prime Game
完全没有头绪听完队友讲的我还是楞了好半天菜慢慢理解.我好菜啊首先要弄懂题目的意思,转换一下题意就是求每个素因子出现区间的次数.区间长度最短为1.我们分析,第一个数的因子会影响1* n个区间(暂时不考虑重复),第二个数的因子会影响2 * (n-1)个区间,以此类推.因此我们只需要分解每一个数然后加上影响的区间即可.我们从前往后处理.可是很容易重复,问题就在于我们如何处理重复的因子.对于位置i...原创 2019-10-09 17:29:59 · 185 阅读 · 0 评论 -
HDU - 2973威尔逊定理
核心问题就是那个等式我们观察到等式可以写成(n-1)!-1/n-[(n-1)!/n]的形式,这样就应该联想到威尔逊定理了。回顾一下威尔逊定理的内容:当且仅当n为素数的时候n|(n-1)!-1,n为合数且大于4的时候n|(n-1)!【参见威尔逊定理的证明】对于这个等式,n显然是大于4的,那么如果n是一个合数,后一个就是一个整数,前一个就是这个整数加上一个1/n,向下取整以后就是0,如果n是一...原创 2019-10-09 22:16:58 · 247 阅读 · 0 评论 -
Miller_Rabin算法
这个算法可以有效检测大整数是不是素数.算法的详细证明参见大佬的博客这里放板子#include<iostream>#include<algorithm>#include<cstring>#include<cstdlib>#include<cmath>#include<ctime>using namespace ...原创 2019-09-22 14:16:52 · 284 阅读 · 0 评论