最近写到一些基础数论题,
发现一个可怕的事实
基础数论的理论我都懂,但是连最基础的板子都有可能敲错
所以特意停下手中的题,进行基础数论的实现

First.欧几里得(辗转相除)

int gcd(int a,int b)
{int r=a%b;while (r){a=b;b=r;r=a%b;}return b;
}

Second.扩展欧几里得

ax+by=gcd(a,b)
ax+by=bx’+(a%b)y’
ax+by=bx’+(a-(a/b)*b)y’
ax+by=ay’+b(x’-(a/b)y’)

x=y’
y=x’-(a/b)y’

使用条件

等号右边一定是gcd(a,b)*k (k!=0)
如果是求拟元,则gcd(a,b)==1

int exgcd(int a,int b)
{if (b==0){x=1;y=0;return;}else{exgcd(b,a%b);int t=y;y=x-(a/b)*y;x=t;}
}

Third.KSM+费马小定理

使用条件

a,p互质

ll KSM(ll a,int b,ll p)
{ll t=1;a%=p;while (b){if (b&1)t=(t%p*a%p)%p;b>>=1;a=(a%p*a%p)%p;}return t%p;
}ll fm(ll x,ll p)
{return KSM(x,p-2,p);
}

Forth.线性求拟元
a在mod p意义下的拟元
p%a=p-(p/a)*a
p%a=-(p/a)*a
a=(p%a)*(-p/a)^-1
a^-1=inv[p%a]*(p-p/a)

int inv[N];void INV(int n,int p)
{inv[0]=0;inv[1]=1;for (int i=2;i<=n;i++)inv[i]=(p-(p/i))*inv[p%i]%p;
}

Fifth.bsgs

map<ll,int> mp;int bsgs(ll x,ll z,ll p)
{x%=p; z%=p;mp.clear();if (x==0&&z==0) return 0;if (x==0) return -1;ll m=(ll)ceil(sqrt((double)p)),now=1;mp[1]=m+1;for (int i=1;i<m;i++){now=(now%p*x%p)%p;if (!mp[now]) mp[now]=i;}ll inv=1,tmp=KSM(x,p-m-1,p);for (int k=0;k<m;k++){int i=mp[(z%p*inv%p)%p];if (i){if (i==m+1) i=0;return k*m+i;}inv=(inv%p*tmp%p)%p;}return -1;
}

Sixth.组合数的递推

int C[N][N];void doit(int n,int m)
{int i,j;C[1][1]=1;for (i=2;i<=n;i++)for (j=1;j<=i;j++)C[i][j]=C[i-1][j]+C[i-1][j-1];for (i=1;i<=n;i++){for (j=1;j<=i;j++)printf("%d ",C[i][j]);puts("");}
}

Seventh.Lucas

使用条件

p模数是素数
相当于把n,m变成p进制数
C组合数可以预处理
因为p是质数,所以可以用费马小定理求拟元,
当然如果预处理了C就没有这个问题了

int inv(int x,int p)
{return KSM(x,p-2,p);
}int C(int n,int m)
{if (m>n) return 0;int FZ=1,FM=1;for (int i=n-m+1;i<=n;i++) FZ=(FZ*i)%p;for (int i=2;i<=m;i++) FM=(FM*i)%p;return (FZ%p*inv(FM,p)%p)%p;
}int Lucas(int n,int m,int p)
{if (n<m) return 0;int ans=1;while (m){ans=(ans%p*C(n%p,m%p)%p)%p;n/=p;m/=p;}return ans;
}

Eighth.线性筛素数

int sshu[N],tot=0;
bool no[N];void make(int n)
{memset(no,0,sizeof(no));for (int i=2;i<=n;i++){if (!no[i])sshu[++tot]=i;for (int j=1;j<=tot&&sshu[j]*i<=n;j++){no[sshu[j]*i]=1;if (i%sshu[j]==0) break;   //i%sshu[j] }}
}

Ninth.欧拉函数(phi)
计算式:
phi(i)=i*∏((j-1)/j) {j是素数且i%j==0}

注意

先除后乘防止炸掉

int phi[N];void makephi(int n)   //phi[i]小于等于i且与i互质的数的个数
{int i,j;for (i=1;i<=n;i++) phi[i]=i;for (i=1;i<=tot&&sshu[i]<=n;i++)for (j=sshu[i];j<=n;j+=sshu[i]){phi[j]=phi[j]/sshu[i];phi[i]=phi[j]*(sshu[i]-1);}
}

Tenth.莫比乌斯函数(mu)
μ(1)=1;
μ(素数)=-1
μ(分解质因数后,每个质因子<=1个)=-1^(质因子个数);
μ(其他)=0

莫比乌斯函数完整定义的通俗表达:
1)莫比乌斯函数μ(n)的定义域是N
2)μ(1)=1
3)当n存在平方因子时,μ(n)=0
4)当n是素数或奇数个不同素数之积时,μ(n)=-1
5)当n是偶数个不同素数之积时,μ(n)=1

void makemu(int n)
{mu[1]=1;memset(no,0,sizeof(no));for (int i=1;i<=n;i++){if (!no[i]){sshu[++tot]=i;mu[i]=-1;}for (int j=1;j<=tot&&sshu[j]*i<=n;j++){no[sshu[j]*i]=1;if (i%sshu[j]==0){mu[i*sshu[j]]=0;break;}mu[i*sshu[j]]=-mu[i];}}
}

转载于:https://www.cnblogs.com/wutongtong3117/p/7673243.html

数论基础(浅谈数论的部分实现)相关推荐

  1. 一、C++语法基础(浅谈)

    AddictedToCpp:浅谈C++语法基础 一.计算机基础知识(简述内存) 1. 32位.64位处理器 2.CPU读取内存数据 3.关于指针所占内存大小 4.计算机存储器 5.编码规范 二.关于基 ...

  2. 如何上好计算机应用基础,浅谈如何上好计算机应用基础课

    龙源期刊网 http://doc.xuehai.net 浅谈如何上好计算机应用基础课 作者:杨云霞 来源:<新校园·上旬刊>2017年第04期 摘要:计算机应用基础课是高职学校学生必修的一 ...

  3. 数论12——浅谈指数与对数

    c/c++语言中,关于指数,对数的函数我也就知道那么多 exp(),pow(),sqrt(),log(),log10(), exp(x)就是计算e的x次方,sqrt(x)就是对x开根号 pow()函数 ...

  4. MongoDB 基础浅谈

    作者:hazenweng,腾讯 QQ 音乐后台开发工程师 MongoDB 作为一款优秀的基于分布式文件存储的 NoSQL 数据库,在业界有着广泛的应用.下文对 MongoDB 的一些基础概念进行简单介 ...

  5. [控制原理基础]浅谈PID算法

    一.PID使用背景 当今的自动控制技术都是基于反馈的概念.即一个In Loop闭环的理论,反馈理论的要素包括三个部分:测量.比较和执行.测量关心的变量,与期望值相比较,用这个误差纠正调节控制系统的响应 ...

  6. 浅谈生成函数+卷积+FFT

    在写FFT的时候,经常会遇到和生成函数的结合 一开始不是能明白,结果突然有一天顿悟了 下面就xue微谈一下生成函数,卷积和FFT的关系吧 生成函数 我们经常用生成函数解决以下问题: 设hnhnh_n为 ...

  7. 【大话设计模式】——浅谈设计模式基础

    初学设计模式给我最大的感受是:人类真是伟大啊!单单是设计模式的基础课程就让我感受到了强烈的生活气息. 个人感觉<大话设计模式>这本书写的真好.让貌似非常晦涩难懂的设计模式变的生活化.趣味化 ...

  8. gif透明背景动画_前端基础系列之bmp、jpg、png、gif、svg常用图片格式浅谈(二)...

    IT客栈 作者:大腰子 bmp.jpg.png.gif.svg常用图片格式 之前为大家介绍了几种WEB前端常用的图片格式,对比了它们的特点,参见<前端基础系列之bmp.jpg.png.gif.s ...

  9. 计算机基础中怎么评价,浅谈职校计算机基础教学中的教学评价

    浅谈职校计算机基础教学中的教学评价 在我们具体实施任务驱动法的教学过程中,教学评价是非常重要的环节.教学评价是计算机课 (本文共2页) 阅读全文>> 随着时代的发展,人们对高等教育发展的关 ...

  10. 浅谈三个星期零基础入门学习Thinkphp5开发restful-api接口的心得和总结

    一丢丢心得体会: 首先不得不说一下,学习一门知识,真的就像建一栋高楼一样,地基必须的稳固,否则你辛辛苦苦建的楼可能随时会垮掉,这一点在我学习thinkphp5的路上深有体会,同时了自此我也爱上了写博客 ...

最新文章

  1. JDBC-Mysql-编译预处理(占位符)
  2. (动态,静态)(解释,编译)(强类型,弱类型)
  3. pc 图片预览放大 端vue_安利一款简单好用的Vue图片预览插件
  4. 一篇文章,带你见证编程语言的诞生!
  5. 甲醛、苯、甲苯、二甲苯对人体健康的危害
  6. 史上最全!计算机科学领域顶会最佳论文大合集:微软研究院最多,清华排24...
  7. 单链表的实现操作(C语言)
  8. 用ASP+DLL实现WEB方式修改服务器时间
  9. 教你怎么在arxiv快速下载pdf论文
  10. Mdict to macOS Dictionary转换笔记
  11. DCDC与LDO浅析
  12. mysql怎么把两个表格的数据合并成一行_mysql中将多行数据合并成一行数据
  13. Golang interface接口深入理解
  14. lanhelper1.83 注册
  15. Intent直接跳转到Fragment
  16. 生命线检查计算机还是连接线,lifeline生命线泰勒到达山脚找到控制室 面对控制室的电脑电线要怎么做...
  17. 怎么用计算机算出出生日期,算农历出生日期计算器,根据出生日期怎么算年龄?...
  18. 行人重识别(Person re-identification)概述
  19. js中unload什么意思_javascript事件之卸载(unload)事件
  20. 群晖 NAS DS218j的优秀与缺憾

热门文章

  1. 同济大学数学系高等数学第6版笔记和课后答案
  2. log4cplus指南
  3. .ani动态鼠标指针图像无法显示
  4. 小球碰撞python代码_Java 实现小球碰撞GUI
  5. ROS教程之读取激光雷达(sick_tim561)数据
  6. Web前端页面劫持和反劫持
  7. html/css表单美化
  8. 数字电路技术可能出现的简答题_数字电子技术基础(Ⅰ)-中国大学mooc-试题题目及答案...
  9. Esri官网购买个人版ArcGIS Pro激活方法
  10. Python中IO编程-StringIO和BytesIO