博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【模板】一堆数论模板 [数论]
阅读量:5327 次
发布时间:2019-06-14

本文共 3039 字,大约阅读时间需要 10 分钟。

 

线性筛

线性筛素数

#include
using namespace std;const int N=10000000+5,inf=0x3f3f3f3f;int n,m;int prime[N],v[N],num_prime=0;int main(){ scanf("%d%d",&n,&m); memset(prime,0,sizeof(prime)); memset(v,0,sizeof(v)); for(int i=2;i<=n;++i){ if(!v[i]) v[i]=i,prime[++num_prime]=i; for(int j=1;j<=num_prime&&i*prime[j]<=n;++j){ v[i*prime[j]]=prime[j]; if(!(i%prime[j])) break; } } for(int i=1,x;i<=m;++i){ scanf("%d",&x); if(v[x]==x) puts("Yes"); else puts("No"); } return 0;}

扩欧

求关于x的同余方程ax1(modb)的最小正整数解

 

#include
using namespace std;#define ll long longvoid exgcd(ll a,ll b,ll &x,ll &y){ if(!b) {x=1,y=0;return;} exgcd(b,a%b,x,y); ll t=x;x=y,y=t-(a/b)*y; }ll A,B,x,y;int main(){ scanf("%lld%lld",&A,&B); exgcd(A,B,x,y); printf("%lld",(x%B+B)%B); return 0;}

 

逆元

线性逆元筛

#include
using namespace std;#define ll long longconst int N=20000528+55;int n,p;ll inv[N];int main(){ scanf("%d%d",&n,&p); inv[1]=1;puts("1"); for(int i=2;i<=n;++i) inv[i]=(ll)inv[p%i]*(p-p/i)%p,printf("%lld\n",inv[i]); return 0;}

logn求逆元 费马小定理 扩展欧几里德 

中国剩余定理

中国剩余定理

#include
using namespace std;#define ll long longint n,a[15],m[15],M;template
void rd(t &x){ x=0;int w=0;char ch=0; while(!isdigit(ch)) w|=ch=='-',ch=getchar(); while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar(); x=w?-x:x;}void exgcd(ll a,ll b,ll &x,ll &y){
//扩展欧几里德 if(!b) {x=1,y=0;return;} exgcd(b,a%b,x,y); ll t=x;x=y,y=t-a/b*y;}ll china(int n,int *a,int *m){ ll ans=0,M=1,x,y; for(int i=1;i<=n;++i) M*=m[i]; for(int i=1;i<=n;++i){ ll mi=M/m[i]; exgcd(mi,m[i],x,y); x=(x%m[i]+m[i])%m[i]; ans=(ans+a[i]*mi*x)%M; } return (ans+M)%M; }int main(){ rd(n); for(int i=1;i<=n;++i) rd(a[i]); for(int i=1;i<=n;++i) rd(m[i]); printf("%lld",china(n,a,m)); return 0;}

扩展中国剩余定理

暂时粘上以前的...

#include
using namespace std;const int N=1e5+5;#define ll long longll n,ai[N],bi[N];template
void rd(t &x){ x=0;int w=0;char ch=0; while(!isdigit(ch)) w|=ch=='-',ch=getchar(); while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar(); x=w?-x:x;}ll exgcd(ll a,ll b,ll &x,ll &y){ if(!b) {x=1,y=0;return a;} ll gcd=exgcd(b,a%b,x,y); ll t=x;x=y,y=t-a/b*y; return gcd;}ll mul(ll a,ll b,ll mod){ ll ans=0; while(b) { if(b&1) ans=(ans+a)%mod; a=(a+a)%mod,b>>=1; } return ans;}ll excrt(){ ll x,y; ll M=bi[1],ans=ai[1];//第一个方程的解 for(int i=2;i<=n;i++) { ll a=M,b=bi[i],c=(ai[i]-ans%b+b)%b; ll gcd=exgcd(a,b,x,y),bg=b/gcd; //求方程 t*M mod bi =ai-x 的解t if(c%gcd) return -1; x=mul(x,c/gcd,bg); ans+=x*M,M*=bg,ans=(ans%M+M)%M; } return (ans%M+M)%M;}int main(){ rd(n); for(int i=1;i<=n;i++) rd(bi[i]),rd(ai[i]); printf("%lld",excrt()); return 0;}

 

转载于:https://www.cnblogs.com/lxyyyy/p/11247022.html

你可能感兴趣的文章
一个.NET通用JSON解析/构建类的实现(c#)
查看>>
Windows Phone开发(5):室内装修 转:http://blog.csdn.net/tcjiaan/article/details/7269014
查看>>
详谈js面向对象 javascript oop,持续更新
查看>>
关于这次软件以及pda终端的培训
查看>>
jQuery上传插件Uploadify 3.2在.NET下的详细例子
查看>>
如何辨别一个程序员的水平高低?是靠发量吗?
查看>>
新手村之循环!循环!循环!
查看>>
正则表达式的用法
查看>>
线程安全问题
查看>>
SSM集成activiti6.0错误集锦(一)
查看>>
个人作业
查看>>
下拉刷新
查看>>
linux的子进程调用exec( )系列函数
查看>>
MSChart的研究
查看>>
C# 索引器
查看>>
MySQLdb & pymsql
查看>>
zju 2744 回文字符 hdu 1544
查看>>
XmlDocument
查看>>
delphi 内嵌汇编例子
查看>>
SQL server 2012 安装SQL2012出现报错: 启用 Windows 功能 NetFx3 时出错
查看>>