声明:感谢修改这篇博客的dsr

Day 1

先说一下上午的听课吧,哎~,简直了,简直(⊙o⊙)…咋说呢,引人入胜???No! 是昏昏欲睡好吧。。。一点听课欲都没有(强撑....),一上午停下来简直怀疑人生。下午上机,啥??上机居然断网!!!搞啥子嘛,,,于是整理上午的笔记,╮(╯▽╰)╭内心崩溃。

一、同余

知识点:

同余,如果a和b对m取模得到的结果相同,那么说a和b在模m意义下相等,或者说二者同余,记作a≡b (mod m)(其实中间应该是三条杠,但是打不出来),并且就划分为同一类。显然模m意义下一共有m类数字,以0,1,...,m-1为代表元素。注意负数也是可以取模的,例如-1 mod 3 = 2。如果a=km+r(0<=r<m),那么a=r(mod m),这称作”带余除法”。特殊的,如果r=0,那么m是a的因数,a是m的倍数,称为m整除a,记作m|a。

 

代码实现:

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
ll a,b,x,y,z;
inline ll read() {
ll n=,f=;char ch=getchar();
while (ch<'' || ch>'') {if(ch=='-') f=-;ch=getchar();}
while (ch<='' && ch>='') {n=(n<<)+(n<<)+ch-'';ch=getchar();}
return n*f;
}
inline void gcd(ll a,ll b) {
if(!b) {
x=,y=;
return ;
}
gcd(b,a%b);
z=x,x=y;
y=z-a/b*y;
}
int main() {
a=read(),b=read();
gcd(a,b);
printf("%lld\n",(x+b)%b);
return ;
}

代码实现

二、因数

知识点:

刚才说了,如果a|b,也就是a整除b,那么b是a的倍数,a是b的因数。显然如果a|b,a|c,那么a|(b±c),a|(bx+cy),即a整除b和c的线性组合最大公因数gcd(a,b),或者简写成(a,b),定义为,最大的d,满足d|a且d|b。显然d|(a,b)等价于,d|a且d|b另一个很显然的是,(a,b)=(a+b,b)=(a-b,b)=(a mod b,b)特别的,如果(a,b)=1,那么称作a和b互质最小公倍数[a,b]同理。二者关系:[a,b]=ab/(a,b),注意只对两个数字恒有效。

三、欧拉定理

四、逆元

Exgcd 求逆元 代码实现:

 #include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
typedef long long ll;
ll a,b,x,y,z,n,mod;
inline ll read() {
ll n=,f=;char ch=getchar();
while (ch<'' || ch>'') {if(ch=='-') f=-;ch=getchar();}
while (ch<='' && ch>='') {n=(n<<)+(n<<)+ch-'';ch=getchar();}
return n*f;
}
inline void exgcd(ll a,ll b,ll &x,ll &y) {
if(!b) {
x=,y=;
return ;
}
exgcd(b,a%b,x,y);
z=x,x=y;
y=z-a/b*y;
}
int main() {
n=read(),mod=read();
exgcd(n,mod,x,y);
x=(x%mod+mod)%mod;
printf("%lld\n",x);
return ;
}

代码实现

线性求逆元 代码实现:

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
const int N=3e6+;
inline int read() {
int n=,f=;char ch=getchar();
while (ch<'' || ch>'') {if(ch=='-') f=-;ch=getchar();}
while (ch<='' && ch>='') {n=(n<<)+(n<<)+ch-'';ch=getchar();}
return n*f;
}
int n,p,a[N];
int main(){
n=read(),p=read();
a[]=a[]=;
for(int i=;i<=n;++i) a[i]=a[i]-(ll)(p/i)*a[p%i]%p;
for(int i=;i<=n;++i) {
if(a[i]<) a[i]+=p;
printf("%d\n",a[i]);
}
return ;
}

代码实现

五、扩展欧拉定理

 

六、卢卡斯定理

代码实现

 #include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=1e5+;
int n,m,p,k;
ll a[N],b[N];
inline int read() {
int n=,f=;char ch=getchar();
while (ch<'' || ch>'') {if(ch=='-') f=-;ch=getchar();}
while (ch<='' && ch>='') {n=(n<<)+(n<<)+ch-'';ch=getchar();}
return n*f;
}
inline ll lucas(int x,int y) {
if(x<y) return ;
else if(x<p) return b[x]*a[y]*a[x-y]%p;
else return lucas(x/p,y/p)*lucas(x%p,y%p)%p;
}
int main() {
k=read();
while (k--) {
n=read(),m=read(),p=read();
a[]=a[]=b[]=b[]=;
for(int i=;i<=n+m;++i) b[i]=b[i-]*i%p;
for(int i=;i<=n+m;++i) a[i]=(p-p/i)*a[p%i]%p;
for(int i=;i<=n+m;++i) a[i]=a[i-]*a[i]%p;
printf("%lld\n",lucas(n+m,m));
}
return ;
}

代码实现

七、GCD/EXGCD

代码实现:

 inline void exgcd(ll a,ll b,ll &x,ll &y) {
if(!b) {
x=,y=;
return ;
}
exgcd(b,a%b,x,y);
z=x,x=y;
y=z-a/b*y;
}

主要代码

青蛙的约会:

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
const int N=;
ll x,y,m,n,l,a,b,js,mod; inline ll read() {
ll n=,f=;char ch=getchar();
while (ch<''||ch>'') {if(ch=='-') f=-;ch=getchar();}
while (ch>=''&&ch<='') {n=n*+ch-'';ch=getchar();}
return n*f;
} inline ll gcd(ll a,ll b) {
if(b) return gcd(b,a%b);
else return a;
} inline void IU(ll a,ll b,ll &x,ll &y) {
if(!b) {
x=,y=;
return ;
}
IU(b,a%b,y,x);
y-=a/b*x;
} inline void pd() {
if((b-a)%js) printf("Impossible\n");
else {
x=(x*((b-a)/js)%mod+mod)%mod;
printf("%lld\n",x);
}
} int main() {
a=read(),b=read(),m=read(),n=read(),l=read();
js=gcd(m-n,l);
mod=abs(l/js);
IU(m-n,l,x,y);
pd();
return ;
}

代码实现

八、关于二元一次不定方程

知识点(Zz..摘自度娘):

使二元一次方程两边相等的一组未知数的值,叫做二元一次方程的一个解.

对二元一次方程的解的理解应注意以下几点:

①一般地,一个二元一次方程的解有无数个,且每一个解都是指一对数值,而不是指单独的一个未知数的值;

②二元一次方程的一个解是指使方程左右两边相等的一对未知数的值;反过来,如果一组数值能使二元一次方程左右两边相等,那么这一组数值就是方程的解;

③在求二元一次方程的解时,通常的做法是用一个未知数把另一个未知数表示出来,然后给定这个未知数一个值,相应地得到另一个未知数的值,这样可求得二元一次方程的一个解.

折叠注意点:

(1)二元一次方程组:由两个二元一次方程所组成的一组方程,叫做二元一次方程组.

(2)二元一次方程组的解:二元一次方程组中两个方程的公共解,叫做二元一次方程组的解.

对二元一次方程组的理解应注意:

①方程组各方程中,相同的字母必须代表同一数量,否则不能将两个方程合在一起.

②怎样检验一组数值是不是某个二元一次方程组的解,常用的方法如下:将这组数值分别代入方程组中的每个方程,只有当这组数值满足其中的所有方程时,才能说这组数值是此方程组的解,否则,如果这组数值不满足其中任一个方程,那么它就不是此方程组的解.

九、CRT

知识点:

定理1:几个数相加,如果存在一个加数,不能被整数a整除,那么它们的和,就不能被整数a整除。

定理2:两数不能整除,若除数扩大(或缩小)了几倍,而被除数不变,则其商和余数也同时扩大(或缩小)相同的倍数(余数必小于除数)。

 

代码实现:

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
ll m[],a[];
int n;
inline ll read() {
ll n=,f=;char ch=getchar();
while (ch<'' || ch>'') {if(ch=='-') f=-;ch=getchar();}
while (ch<='' && ch>='') {n=(n<<)+(n<<)+ch-'';ch=getchar();}
return n*f;
}
inline int fread() {
int n=,f=;char ch=getchar();
while (ch<'' || ch>'') {if(ch=='-') f=-;ch=getchar();}
while (ch<='' && ch>='') {n=(n<<)+(n<<)+ch-'';ch=getchar();}
return n*f;
}
inline void gcd(ll a,ll b,ll &d,ll &x,ll &y) {
if(!b){
d=a;
x=,y=;
} else{
gcd(b,a%b,d,y,x);
y-=(a/b)*x;
}
}
inline ll work_(int n,ll *m,ll *a) {
ll p=,d,y,x=;
for(int i=;i<n;++i) p*=m[i];
for(int i=;i<n;++i){
ll w=p/m[i];
gcd(m[i],w,d,d,y);
x=(x+y*w*a[i])%p;
}
return (x+p)%p;
}
int main() {
n=fread();
for(int i=;i<n;++i) m[i]=read(),a[i]=read();
printf("%lld",work_(n,m,a));
}

代码实现

十、扩展欧几里得

 

十一、线性筛

知识点:

可以在O(n)时间内筛出1~n的所有质数。如果F(n)是个积性函数,根据定义我们只要能够低于O(lgn)的知道每个F(p^c)的值,我们就能在O(n)时间内求出F(1)~F(n)。具体做法是这样的,每次枚举一个数字i,枚举所有已经筛出来的1~i中的质数k,那么x=ik不是质数,并且k是x的最小质因子。如果i%k==0,就break掉k的循环。可以证明每个数字都只会被其最小的质因子筛去,同时利用这个性质可以顺便筛出一些积性函数。这样你可以维护每个数字的最小质因子lp[n],最小质因子对应的那个若干次方lpc[n],这样对于积性函数每次只要计算满足lpc[n]=n的那些F[n],然后用积性函数的性质就可以维护1~n的F。

代码实现:

 #include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=;
int n,m,x;
bool vis[N]={,};
int a[N];
inline int read() {
int n=,f=;char ch=getchar();
while (ch<'' || ch>'') {if(ch=='-') f=-;ch=getchar();}
while (ch<='' && ch>='') {n=(n<<)+(n<<)+ch-'';ch=getchar();}
return n*f;
}
//
inline void ss(int n,int m) {
for(int i=;i*i<=n;++i)
if(!vis[i])
for(int j=i*i;j<=n;j+=i) vis[j]=true;
while(m--) {
x=read();
if(vis[x]) printf("No\n");
else printf("Yes\n");
}
return;
}
// 2
inline void IU(int n,int m) {
int js=;
for(int i=;i<=n;++i) {
if(!vis[i]) a[++js]=i;
for(int j=;j<=js&&i*a[j]<=n;++j) {
vis[i*a[j]]=true;
if(i%a[j]==) break;
}
}
while(m--) {
x=read();
if(vis[x]) printf("No\n");
else printf("Yes\n");
}
}
int main() {
n=read(),m=read();
//ss(n,m);
IU(n,m);
return ;
}

代码实现

十二、BSGS

知识点:

bsgs算法,又称大小步算法(某大神称拔山盖世算法)或北上广深算法。

主要用来解决   A^x=B(mod C)(C是质数),都是整数,已知ABCx

代码实现(poj 2417):

 #include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<map>
using namespace std;
typedef long long ll;
map<ll,int> q;
ll p,m,n,a,b,z,ans,t,bz;
inline ll fpow(ll x) {
ll s=,res=a;
while (x>) {
if(x&) s=(s*res)%p;
x=x>>;
res=(res*res)%p;
}
return s;
}
int main() {
while (scanf("%lld%lld%lld",&p,&a,&b)!=EOF) {
if(a%p==) {
printf("no solution\n");
continue;
}
q.clear();
m=ceil(sqrt(p));
bz=,z=b%p,q[z]=;
for(int i=;i<=m;++i) z=(z*a)%p,q[z]=i;
t=fpow(m);
z=;
for(int i=;i<=m;++i) {
z=(z*t)%p;
if(q[z]) {
bz=;
ans=i*m-q[z];
printf("%lld\n",(ans%p+p)%p);
break;
}
}
if(!bz) printf("no solution\n");
}
return ;
}

代码实现

十三、莫比乌斯反演

知识点:(摘自度娘~~

数论函数,就是正整数映射到非负整数的函数。积性函数,如果一个数论函数f满足对于任意(x,y)=1,有f(xy)=f(x)f(y),那么称f是积性函数。显只要知道了所有的f(p^c)就可以知道所有的f(n)完全积性函数,如果一个数论函数满足对于任意xy,都有f(xy)=f(x)f(y),那么称f是完全积性函数

性质:

  性质一(莫比乌斯反演公式): 

  性质二:μ(n)积性函数

  性质三:设f是算术函数,它的和函数 

       是积性函数,那么 也是积性函数。

 

 莫比乌斯反演定理:

设f(n) 和g(n) 是定义在正整数集合上的两个函数,定义如下。

       

      

  

证明:(摘自度娘~

充分性证明:

        

        

        

        

考虑到:

      

因此

        

必要性证明:

        

考虑到:

          

因此
        

证明2

例题:

问题描述

给定5个整数:a, b, c, d, k,你要在a中找到x。在c b,y…即GCD(x, y) = k, GCD(x, y)表示xy的最大公约数,由于选项的数量可能很大,所以只需要输出不同的数对的总数。请注意,(x=5, y=7)(x=7, y=5)被认为是相同的。

输入

输入由几个测试用例组成。输入的第一行是案例的数量。不超过3000例。

每一种情况包含五个整数:abcdk0 < a <= b <= 100,000, 0 < c <= d <=
100,000, 0 <= k <= 100,000
,如上所述。

输出

对于每个测试用例,打印选项的数量。使用示例中的格式。

样例输入

2

1 3 1 5 1

1 11014 1 14409 9

样例输出

案例1:9

案例2:736427

代码实现:

 #include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<map>
using namespace std;
typedef long long ll;
const int N=1e5+;
int v[N],a[N],b[N];
int n,m,js,jc,x,y,z,k;
ll res,ans;
inline int read() {
int n=,f=;char ch=getchar();
while (ch<'' || ch>'') {if(ch=='-') f=-;ch=getchar();}
while (ch<='' && ch>='') {n=(n<<)+(n<<)+ch-'';ch=getchar();}
return n*f;
}
int main() {
b[]=;
for(int i=;i<=;++i) {
if(!v[i]) a[++js]=i,b[i]=-;
for(int j=;j<=js;++j) {
int k=a[j]*i;
if(k>) break;
v[k]=;
if(i%a[j]==) {
b[k]=;
break;
} else b[k]=-b[i];
}
}
k=read();
while(k--) {
++jc;
res=ans=;
n=read(),m=read(),x=read(),y=read(),z=read();
if(!z) {
printf("Case %d: 0\n",jc);
continue;
}
m/=z;y/=z;
if(m>y) swap(m,y);
for(int i=;i<=m;++i) res+=(ll)b[i]*(m/i)*(y/i);
for(int i=;i<=m;++i) ans+=(ll)b[i]*(m/i)*(m/i);
printf("Case %d: %lld\n",jc,res-ans/);
}
return ;
}

代码实现

十四、狄利克雷卷积

十五、数论分块

cyyz : Day 1 数论整理的更多相关文章

  1. OI 数论整理

    1.素数: 质数(prime number)又称素数,有无限个.一个大于1的自然数,除了1和它本身外,不能被其他自然数整除,换句话说就是该数除了1和它本身以外不再有其他的因数;否则称为合数. 2016 ...

  2. cyyz: Day 4 网络流整理

    Day 4 网络流的理论性知识(算了..我自己都看不下去,还是整理些例题以后复习用吧qaq): 一.PPT(主要内容)   二.搜自度娘 定义: 年,L.R. 福特和 D.R. 富尔克森等人给出了解决 ...

  3. cyyz: Day 6 平衡树整理

    一.平衡树 知识点: ,并且左右两个子树都是一棵平衡二叉树.平衡二叉树的常用实现方法有红黑树.AVL.替罪羊树.Treap.伸展树等. 最小二叉平衡树的节点的公式如下 F(n)=F(n-1)+F(n- ...

  4. 【数学】NOIP数论内容整理

    NOIP数论内容整理 注:特别感谢sdsy的zxy神仙以及lcez的tsr筮安帮助审稿 一.整除: 对于\(a,b~\in~Z\),若\(\exists~k~\in~Z\),\(s.t.~b~=~k~ ...

  5. 【学习整理】NOIP涉及的数论 [updating]

    扩展欧几里得 求二元一次不定式方程 的一组解. int exgcd(int a,int b,int &x,int &y) { int t; ;y=;return a;} t=exgcd ...

  6. 清北澡堂 Day2 下午 一些比较重要的数论知识整理

    1.欧拉定理 设x1,x2,.....,xk,k=φ(n)为1~n中k个与n互质的数 结论一:axi与axj不同余 结论二:gcd(axi,n)=1 结论三:x1,x2,...,xk和ax1,ax2, ...

  7. 清北澡堂 Day2 上午 一些比较重要的关于数论的知识整理

    1.算数基本定理: 对于任意的大于1的正整数N,N一定能够分解成有限个质数的乘积,即 其中P1<P2<...<Pk,a1,a2,...,ak>=1; 证: 存在性: 若存在最小 ...

  8. 【NOIP数论内容整理】

    转载{大佬传送门} 附赠wakelin一句评论:日均二百七,全场rank1:千古神犇ZAY,吊打清华钟皓曦%%%

  9. cyyz: Day 2 线段树知识整理

    Day 2 上午的听课,哎~昏昏欲睡好吧.. 一.扫描线 知识点: 由于多边形千变万化,要想填充多边形内部的所有像素,需要找到一种合适的规则,能够沿着一个方向,一个像素不漏地把多边形内部填满,同时不污 ...

随机推荐

  1. SqlServer调用OPENQUERY函数远程执行增删改查

    /* OPENQUERY函数,远程执行数据库增删改查 关于OPENQUERY函数第二个参数不支持拼接变量的方案 方案1:将OPENQUERY语句整个拼接为字符串,再用EXEC执行该字符串语句 方案2: ...

  2. Golang ---json解析

    golang官方为我们提供了标准的json解析库–encoding/json,大部分情况下,使用它已经够用了.不过这个解析包有个很大的问题–性能.它不够快,如果我们开发高性能.高并发的网络服务就无法满 ...

  3. 在linux系统下安装两个nginx以及启动、停止、重起

    如果没有安装过nginx请看:linux下nginx部署以及配置详解 1.第一个nginx已经安装完成后,现在安装第二个nginx 启动:sudo /usr/sbin/nginx3 重起:sudo / ...

  4. 据时间生成唯一序列ID

    据时间生成唯一序列ID /** * <html> * <body> * <P> Copyright 1994 JsonInternational</p> ...

  5. WPF 的 VisualBrush 只刷新显示的视觉效果,不刷新布局范围

    原文:WPF 的 VisualBrush 只刷新显示的视觉效果,不刷新布局范围 WPF 的 VisualBrush 可以帮助我们在一个控件中显示另一个控件的外观.这是非常妙的功能. 但是本文需要说其中 ...

  6. 2019 巨人网络java面试笔试题 (含面试题解析)

    本人3年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.巨人网络等公司offer,岗位是Java后端开发,最终选择去了巨人网络. 面试了很多家公司,感觉大部分公司考察的点 ...

  7. C++字符串相互转换

    转自cs_wu原文 C++ char*,const char*,string的相互转换 1. string转const char* string s ="abc"; const c ...

  8. 关于创建Web图像时应记住的五个要素

    1. 格式与下载速度 当前,Web上用的最广泛的三种格式是GIF.PNG和JPEG.我们的目标是选择质量最高,同时文件最小的格式. WebP图像格式 谷歌建立了另一种图像格式,名为WebP. 这种格式 ...

  9. jq对象才能使用jq方法,$(".a").eq(0) 和 $(”.a“)[0]

    <a class="a"></a> <a class="a"></a> <a class="a& ...

  10. 内核加载错误module license

    出现如下错误: module_name: Unknown symbol "symbol_name" tail /var/log/messages查看具体错误 出现如下错误: Unk ...