![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数论
文章平均质量分 67
鲜果维他命
Don't be a programmer,to be a problem solver
展开
-
2017ICPC西安现场赛 XOR(线段树合并线性基)
题目链接:https://nanti.jisuanke.com/t/A1607题目大意 :给你长度为n的序列,以及一个数k,有q次询问,每一次询问给你一个区间[L,R],然后你可以在区间内取任意多个数(每个数只能去一次),异或这些数得到一个值val,使得k|val的最值大,输出这个最大值分析:或(|)操作,我们知道对应二进制为只要有一个1,结果就为1,所以我们让k|val最大,必须把k的高位0尽可能变为1,那么我们对k的二进制位取反得到一个数x,也变成了我们尽可能保留x的高位1,所以我们把原序列的所有数原创 2021-07-21 18:06:23 · 183 阅读 · 0 评论 -
莫比乌斯函数(Mobius)的求法 每日一遍,算法再见!
莫比乌斯函数我们用符号u表示莫比乌斯函数,u(x)表示x的莫比乌斯函数①x=1,u(1)=1.②x=p1p2p3p4…pk,其中p1~pk是x的素数因子,u(x)=(−1)k(-1)^k(−1)k③其他情况u(x)=0②和③的情况通俗的讲,就是把x用素数乘积的形式表示,如果存在一个素数的指数大于1那么u(x)=0,否则u(x)=(−1)k(-1)^k(−1)k.欧拉筛求Mobius函数代码:void get_mu(){ memset(vis,false,sizeof(vis)); mu原创 2021-02-19 20:51:39 · 1643 阅读 · 0 评论 -
因子与因子个数,以及因子和(超详细推导+讲解) 每日一遍,算法再见!
因子与因子个数定义:求因子个数模板代码:#include<bits/stdc++.h>using namespace std;int get_count(int x){ int ans=1; for(int i=2;i*i<=x;i++) { int a=0; if(x%i==0) { while(x%i==0) { a++; x/=i; } } ans=ans*(a+1); } /*这里要检查x是否为1,因为上原创 2021-02-18 10:39:26 · 2136 阅读 · 0 评论 -
欧拉函数(详细证明+推导) 每日一遍,算法再见!
欧拉函数定义:对于一个正整数n,n的欧拉函数ϕ(n)\phi(n)ϕ(n),表示小于等于n与n互质的正整数的个数性质性质1:如果n是质数,那么ϕ(n)=n−1\phi(n)=n-1ϕ(n)=n−1,因为只有n本身与它不互质。性质2:如果p,q都是质数,那么ϕ(p∗q)=ϕ(p)∗ϕ(q)=(p−1)∗(q−1)\phi(p*q)=\phi(p)*\phi(q)=(p-1)*(q-1)ϕ(p∗q)=ϕ(p)∗ϕ(q)=(p−1)∗(q−1).性质2推导:p,2p,3p,....,(q−1)∗p原创 2021-02-14 21:59:03 · 13809 阅读 · 9 评论 -
数论分块(整除分块) 每日一遍,算法再见!
文章目录数论分块(整除分块)证明+推导模板例题分析请关注我看更多数论分支知识体系讲解,也别忘点个赞额!数论分块(整除分块)证明+推导模板代码:#include<bits/stdc++.h>using namespace std;typedef long long ll;int main(){ ll n; cin>>n; ll ans=0; /*初始化l为1,因为我们从1开始遍历*/ for(ll l=1,r;l<=n;l=r+1)//下一个值的l原创 2021-02-14 19:05:40 · 285 阅读 · 0 评论 -
佩尔方程(超详细推导+例题讲解) 每日一遍,算法再见!
这里写目录标题佩尔方程第一类佩尔方程第一类佩尔方程例题讲解第二类佩尔方程佩尔方程第一类佩尔方程定义:形如x2−dy2=1x^2 - dy^2 = 1x2−dy2=1(d>1,且d不是完全平方数)要求第一类佩尔方程的解都是正整数解,也即(x,y),x>0,y>0(x,y),x>0,y>0(x,y),x>0,y>0为什么要求d不是完全平方数呢?我们假设d是完全平方数则x2−dy2=1x^2 - dy^2 = 1x2−dy2=1等价于(x+d∗y)(x−原创 2021-02-10 15:31:37 · 12554 阅读 · 6 评论 -
中国剩余定理(互质+非互质版),每日一边,算法再见!
中国剩余定理(Chinese remainder theorem(CRT))中国剩余定理的起源什么是中国剩余定理呢?讲一个故事吧秦末时期,楚汉相争,汉初三杰之一的韩信有一次带1500名兵士打仗,战死四五百人。为了统计剩余士兵的个数,韩信令士兵3人一排,多出2人;5人一排,多出4人;7人一排,多出6人。韩信据此很快说出人数:1049人。汉军本来就十分信服韩信大将军,经此之后就更加相信韩信是“天神下凡,神机妙算",于是士气大振,鼓声喧天,在接下来的战役中汉军步步紧逼,楚军乱作一团,大败而逃。韩信由此名扬天原创 2021-02-07 10:02:09 · 477 阅读 · 0 评论 -
BSGS&exBSGS(让你轻松理解和掌握)
BSGS(Baby step Giant step)简称,拔山盖世,不是个事,哈哈哈,不开玩笑了,它的名字叫大步小步算法,主要用来解决形如a^x≡b(mod p)的高次线性同余方程,其中a,p互质,求最小正整数解x的问题解题步骤如下:step1.令m=ceil( sqrt( p ) ),也就是对p开二次根号然后向上取整。step2.令x=i*m-j,1<=i<=m,0<=j<=m-1,此时原式可以表示为a^(im-j)≡b(mod p) ->a^im ≡ b×a^j(m原创 2021-02-04 14:24:51 · 801 阅读 · 0 评论 -
解多元线性同余方程
什么是多元线性同余方程呢?我们知道一元线性同余方程是,之所以称之为一元,是因为它只有一个未知数,那么多元线性同余方程就有多个未知数,别被吓到,其实不难,接下来我们来分析如何解它.定义 : 形如a1x1+a2x2+a3x3+…+anxn=b(mod m)的式子,我们称之为多元线性同余方程我们知道存在y1,y2,使得a1y1+a2y2=gcd(a1,a2),令gcd(ai,ai+1)=gi,那么上式就可以写成a1y1+a2y2=g1,那么a1x1+a2x2=g1*C,C是一个常数我们令m=an+1所以可原创 2021-02-01 11:39:51 · 1324 阅读 · 0 评论 -
解线性同余方程组
一元线性方程组求解什么是一元线性方程组呢?就是由若干个形如x=b1(mod a1),x=b1(mod a2)…组成,之所以称之为一元,是因为只有一个未知数x例如方程组x=b1(mod a1)x=b2(mod a2)x=b3(mod a3)x=b4(mod a4)....x=bn(mod an)如何求x呢?这里就需要用到合并操作,不断把两个方程合并成为一个,最后只剩下一个方程就OK怎么个合并发呢?下面我们来推到两个方程的合并过程x=b1(mod a1)x=b2(mod a2)则原创 2021-02-01 10:38:43 · 630 阅读 · 0 评论 -
求逆元的方法
扩展欧几里得求逆元ax=1(mod p),a,p互质,那么原式可以写成ax+py=gcd(a,p)(mod p),a,p互质,所以gcd(a,b)=1,所以原式等于ax+py=1(mod p),直接通过扩展欧几里得算法即可轻松求得,如果不知道什么是扩展欧几里得算法,建议先学一下https://blog.csdn.net/TheWayForDream/article/details/109014990代码:#include<bits/stdc++.h>using namespace st原创 2021-01-26 22:38:08 · 189 阅读 · 0 评论 -
同余概述(同余定理)
什么是同余定理?相比大家都知道,简单来说就是一个公式如果a=b(mod m),那么我们称a,b关于模m同余,这个式子叫做同余式。定理1.若a=b(mod m),且c=d(mod m),那么ax+cy=bx+dy(mod m),同余式满足加法定理2.若a=b(mod m),且 c=d(mod m),那么,ac=bd(mod m),同余式满足乘法定理3.若a=b(mod m),那么gcd(a,m)=gcd(b,m)定理4.若a=b(mod mi),其中1<=i<=n,当且仅当a=b(mod原创 2021-01-26 22:36:31 · 7443 阅读 · 0 评论 -
2019 ICPC 银川 Function(补题)数论分块+数学
题目链接 https://nanti.jisuanke.com/t/42386推导过程(由于Latex太麻烦就直接板书)AC代码:#include<bits/stdc++.h>using namespace std;typedef long long ll;const ll mod=998244353;ll get_inv(ll dishu,ll zhishu)//a,p-2,,p是mod { ll ans=1; while(zhishu) { if(zhishu.原创 2021-01-21 20:44:21 · 225 阅读 · 0 评论 -
埃拉托斯特尼筛法+细节证明
埃拉托斯特尼筛法顾名思义就是筛素数的方法首先埃拉托斯特尼筛法实基于这样一个定理:一个正合数n,一定存在小于sqrt(n)的素数因子所以此筛法就是将n的所有小于等于sqrt(n)的素数因子圈出来,然后把他们的倍数划去,剩下的没有被划去的就是素数例如:25,sqrt(25)=5,那么所有小于等于5的素数因子就是2,3,5我们把2,3,5的所有倍数划去,也就是4,6,8,9,10,12,14,15,16,18,20,21,22,24,25,最后剩下2,3,5,7,11,13,17,19,23就是素数实原创 2021-01-20 18:39:50 · 1056 阅读 · 0 评论 -
素数定理+应用
素数定理用法:给你一个数x(这个数可能非常大),让你找出小于x的素数个数的位数,素数个数我们记作Π(x)素数定理:当x增大时,Π(x)/(x/lnx)无线趋近于1趁热打铁素数个数的位数小明是一个聪明的孩子,对数论有着很浓烈的兴趣。他发现求1到正整数10n 之间有多少个素数是一个很难的问题,该问题的难以决定于n 值的大小。现在的问题是,告诉你n的值,让你帮助小明计算小于10n的素数的个数值共有多少位?Input输入数据有若干组,每组数据包含1个整数n(1 < n < 100000原创 2021-01-20 15:28:29 · 603 阅读 · 0 评论 -
类欧几里得算法
类欧几里得算法为什么叫类欧几里得算法,顾名思义类似于欧几里得算法,在学习本算法之前可以先学习欧几里得算法,以便于加深对类欧几里得算法的理解作用:类欧几里得可以用来做什么呢,以及证明过程?这里推荐一篇好的视频类欧几里得算法详解视频,可以结合证明过程加深印象,这里推荐一篇好的博客,证明过程很详细类欧几里得算法证明证明需要用到的等式关系用来快速求取代码ll f_gcd(ll a,ll b,ll c,ll n){ ll m=(a*n+b)/c; if(n==0||m==0) return b原创 2020-11-06 15:44:17 · 774 阅读 · 1 评论 -
裴蜀定理(详细定义+应用+模板)
裴蜀定理定义:对于非负整数a,b,存在x,y使得ax+by=gcd(a,b),也就是说ax+by能构成的最小正整数就是gcd(a,b),注意(a,b不同时为0)不难理解,练习一道题吧模板 裴蜀定理思路:要求A1 * x1+A2 * x2+A3 * X3…+An * Xn=S要求最小的S只需要不断迭代即可因为 A1 * x1+A2 * x2=gcd(A1,A2)迭代一次得到 (A1 * x1+A2 * x2)+A3 * x3=gcd(gcd(A1,A2),A3)这样不断迭代下去就到最后,也就原创 2020-10-17 18:01:34 · 2210 阅读 · 0 评论 -
费马小定理(应用+拓展)
费马小定理(应用+拓展)定义:如果两个整数a,p互质,也就是gcd(a,p)=1,那么a^(p-1)≡1( mod p).公式拓展一下拓展公式1:n*a^(p-1)≡n(mod p)拓展公式2:a^(p-2) ≡ a ^(-1) (mod p)拓展公式3:a^b ≡ a^(bmod(p-1)) (mod p)求(A/B)%999983,但由于A很大,我们只给出n(n=A%999983)(我们给定的A必能被B整除,且gcd(B,999983) = 1)。InputInput数据的第一行是一个原创 2020-10-15 17:25:00 · 919 阅读 · 4 评论 -
欧拉筛(细节分析+证明)
欧拉筛法欧拉筛法是用线性时间求取给定范围内的素数的个数,当然素数的值也是可以记录的,适用于大范围性的素数求取,如果只是判断某一个素数,欧拉筛就显得大材小用了(费空间资源),这时候可以考虑Miller-Rabin 素数测试。欧拉函数的时间复杂度趋于O(N)的,即使是1e8也不在话下讲解欧拉筛之前回顾一下埃拉托斯特尼筛法埃拉托斯特尼筛法:原理就是先找出一个素数然后把这个素数的倍数都标记为合数(一个正整数的所有倍数一定是合数,除了1),在下一次遇到被标记的数时直接跳过。例如:第一次遍历遇到素数2,所以原创 2020-10-14 10:43:02 · 4420 阅读 · 4 评论 -
扩展欧几里得算法(简单易懂,详细分析)
扩展欧几里得算法证明+应用扩展欧几里得算法顾名思义是由欧几里得算法延伸出来的一个知识点,在搞懂扩展欧几里得算法之前不妨先来熟悉一下什么是欧几里得算法(又名辗转相除法)欧几里得算法1.应用:主要用于求解两个数a和b的最大公约数,我们不妨设(a>b),其公式为gcd(a,b)=gcd(b,a%b)=gcd(a%b,b%(a%b))=…=gcd(x,0),这里的x即为最大公约数.2.下面展示代码:/*注意a>b,如果a<b交换一下位置即可*/int gcd(int a,int b)原创 2020-10-11 21:06:35 · 13160 阅读 · 7 评论