数论基础(浅谈数论的部分实现)
最近写到一些基础数论题,
发现一个可怕的事实
基础数论的理论我都懂,但是连最基础的板子都有可能敲错
所以特意停下手中的题,进行基础数论的实现
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
数论基础(浅谈数论的部分实现)相关推荐
- 一、C++语法基础(浅谈)
AddictedToCpp:浅谈C++语法基础 一.计算机基础知识(简述内存) 1. 32位.64位处理器 2.CPU读取内存数据 3.关于指针所占内存大小 4.计算机存储器 5.编码规范 二.关于基 ...
- 如何上好计算机应用基础,浅谈如何上好计算机应用基础课
龙源期刊网 http://doc.xuehai.net 浅谈如何上好计算机应用基础课 作者:杨云霞 来源:<新校园·上旬刊>2017年第04期 摘要:计算机应用基础课是高职学校学生必修的一 ...
- 数论12——浅谈指数与对数
c/c++语言中,关于指数,对数的函数我也就知道那么多 exp(),pow(),sqrt(),log(),log10(), exp(x)就是计算e的x次方,sqrt(x)就是对x开根号 pow()函数 ...
- MongoDB 基础浅谈
作者:hazenweng,腾讯 QQ 音乐后台开发工程师 MongoDB 作为一款优秀的基于分布式文件存储的 NoSQL 数据库,在业界有着广泛的应用.下文对 MongoDB 的一些基础概念进行简单介 ...
- [控制原理基础]浅谈PID算法
一.PID使用背景 当今的自动控制技术都是基于反馈的概念.即一个In Loop闭环的理论,反馈理论的要素包括三个部分:测量.比较和执行.测量关心的变量,与期望值相比较,用这个误差纠正调节控制系统的响应 ...
- 浅谈生成函数+卷积+FFT
在写FFT的时候,经常会遇到和生成函数的结合 一开始不是能明白,结果突然有一天顿悟了 下面就xue微谈一下生成函数,卷积和FFT的关系吧 生成函数 我们经常用生成函数解决以下问题: 设hnhnh_n为 ...
- 【大话设计模式】——浅谈设计模式基础
初学设计模式给我最大的感受是:人类真是伟大啊!单单是设计模式的基础课程就让我感受到了强烈的生活气息. 个人感觉<大话设计模式>这本书写的真好.让貌似非常晦涩难懂的设计模式变的生活化.趣味化 ...
- gif透明背景动画_前端基础系列之bmp、jpg、png、gif、svg常用图片格式浅谈(二)...
IT客栈 作者:大腰子 bmp.jpg.png.gif.svg常用图片格式 之前为大家介绍了几种WEB前端常用的图片格式,对比了它们的特点,参见<前端基础系列之bmp.jpg.png.gif.s ...
- 计算机基础中怎么评价,浅谈职校计算机基础教学中的教学评价
浅谈职校计算机基础教学中的教学评价 在我们具体实施任务驱动法的教学过程中,教学评价是非常重要的环节.教学评价是计算机课 (本文共2页) 阅读全文>> 随着时代的发展,人们对高等教育发展的关 ...
- 浅谈三个星期零基础入门学习Thinkphp5开发restful-api接口的心得和总结
一丢丢心得体会: 首先不得不说一下,学习一门知识,真的就像建一栋高楼一样,地基必须的稳固,否则你辛辛苦苦建的楼可能随时会垮掉,这一点在我学习thinkphp5的路上深有体会,同时了自此我也爱上了写博客 ...
最新文章
- JDBC-Mysql-编译预处理(占位符)
- (动态,静态)(解释,编译)(强类型,弱类型)
- pc 图片预览放大 端vue_安利一款简单好用的Vue图片预览插件
- 一篇文章,带你见证编程语言的诞生!
- 甲醛、苯、甲苯、二甲苯对人体健康的危害
- 史上最全!计算机科学领域顶会最佳论文大合集:微软研究院最多,清华排24...
- 单链表的实现操作(C语言)
- 用ASP+DLL实现WEB方式修改服务器时间
- 教你怎么在arxiv快速下载pdf论文
- Mdict to macOS Dictionary转换笔记
- DCDC与LDO浅析
- mysql怎么把两个表格的数据合并成一行_mysql中将多行数据合并成一行数据
- Golang interface接口深入理解
- lanhelper1.83 注册
- Intent直接跳转到Fragment
- 生命线检查计算机还是连接线,lifeline生命线泰勒到达山脚找到控制室 面对控制室的电脑电线要怎么做...
- 怎么用计算机算出出生日期,算农历出生日期计算器,根据出生日期怎么算年龄?...
- 行人重识别(Person re-identification)概述
- js中unload什么意思_javascript事件之卸载(unload)事件
- 群晖 NAS DS218j的优秀与缺憾