2024-08-14 【基础数论】,平安银行java面试流程长


扩展欧几里得算法


裴蜀定理:设a,b是不全为0的整数,则存在整数x,y,使得ax+by=gcd(a,b);

//二元一次方程组ax+by=c 有解的充要条件为gcd(a,b)|c

在这里插入图片描述

int exgcd(int a,int b,int &x,int &y){

if(b==0) {

x=1;

y=0;

return a;

}

int d=exgcd(b,a%b,x,y);

int temp=x;

x=y;

y=temp-a/b*y;

return d;

}

void EX_gcd(int a, int b, int &x, int &y)

{

if(b == 0)//递归出口

{

x = 1;

y = 0;

return;

}

int x1, y1;

Ex_gcd(b, a%b, x1, y1);

x = y1;

y = x1-(a/b)*y1;

}

应用:

  1. 方程ax+by=c的求解

  2. 同余式的求解

  3. 逆元的求解以及除法取模的计算


模运算


性质:

1.取模运算:a%p(a mod p),表示a除以p的余数

2.运算:

​ (a + b) % p = ( a%p + b%p ) % p

​ (a - b ) % p = ( a%p - b%p ) % p

​ (a * b) % p = ( (a%p) * (b%p) ) % p

​ (a ^ b ) % p = ( (a%p)^ b ) % p

​ //除法的取模需要逆元,不能进行类似操作。

​ //模运算满足结合律、交换律、分配律

3.a≡b(mod n)表示a和b模_n_同余,即_a_和_b_除以_n_的余数相等

-5 mod 3 = -2 :这是因为在a,p异号的时候,c++遵循使商尽可能大的原则,选取了-1作为商。所以我们平时计算减法时,为防止要取mod的数字为负数,多加上一个p:

(a - b ) % p = ( ( a % p ) - ( b % p ) + p ) % p;


同余


a%b==c%b 可以说a≡c(mod b);a,c对mod b同余

第二定义:若 m | ( a-b ),a,b对mod m同余

性质:

(1)若a≡b(mod m),则(a,m)=(b,m) [欧几里得算法]

(2)若a≡b(mod m),则_ak_≡bk(mod m)

(3)若a≡b(mod m),且a=a|d,b=b|d, (d,m)=1,则ad≡bd(mod m);


同余式


若用f(x)表示系数为整数的多项式,又设m是一个正整数,则f(x)≡0(mod m)叫做模m的同余式。

//ax+by=gcd(a,b)

一次同余式:ax≡b(mod m) 使同余式成立的_x_叫做该式的一个解

ax≡b(mod m) 与ax+my=b等价

定理1:一次同余式(又叫线性同余方程)有解的充要条件是 (a,m)|b。

证:

​ 一次同余式可写成:ax=my+b => ax-my=b

​ 因y无关紧要,令y=-y,得ax+my=b => (a,m)|b [裴蜀定理];

​ 证毕;

定理2:若gcd(a,b)=1 ,且 x0、y0 为方程 ax+by=c 的一组解,则该方程的任意解可表示为:x=x0+bt,y=y0-at, 且对任意整数 t 都成立。

根据定理 2,可以求出方程的所有解。但在实际问题中,我们往往被要求求出一个最小整数解,也就是一个特解x=(x mod t + t ) mod t ,其中 t=( b / gcd(a,b))


逆元(Day 1 )


方程ax≡1(mod m)的一个解x,称为x为a模m的逆。

//(a,m)=1;

设k是b的逆元 <=> bk mod m = 1;

在这里插入图片描述

逆元的求法

(1)拓展欧几里得解方程

exgcd是求解不定方程ax+by=c的解,由逆元定义,a*inv(a)≡1(mod m)

即a* inv(a)+m*y=1的方程的解,由于a,m已知,根据exgcd可求出inv(a)

只有gcd(a,m)=1时,才有逆元

int exgcd(int a,int b,int &x,int &y){

if(b==0) {

x=1;

y=0;

return a;

}

int d=exgcd(b,a%b,x,y);

int temp=x;

x=y;

y=temp-a/b*y;

return d;

}

int getinv(int a,int mod){//a在mod下的逆元

int x,y;

int d=exgcd(a,mod,x,y);

return d==1?(x%mod+mod)%mod:-1;

}

(2)费马小定理:p是素数,gcd(a,p)=1

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nR9oZTF3-1628948300606)(C:\Users\86138\AppData\Roaming\Typora\typora-user-images\image-20210813173748153.png)]

int quickpow(int a,int p,int mod){//快速幂

int t=1,tt=a%mod;

while§{

if(p&1) t=t*tt%mod;

tt=tt*tt%mod;

p>>=1;

}

return t;

}

int getInv(int a,int mod){

return quick(a,mod-2,mod);

}

线性逆元

线性求1~n所有数关于p的逆元

在这里插入图片描述

typedef long long ll;

const int N=1e5+10;

ll inv[N],mod;

void init(int n){

inv[1]=1;

for(int i=2;i<=n;i++){

inv[i] = ( mod - (mod/i)) * inv[mod % i] % mod;

//线性递推

}

}


素数筛


**素数记数函数:**小于等于x的素数的个数,用F(x)表示,随着x的增大,有这样近似的结果:

F(x) ~ x / ln(x)

利用素数来解决问题,如何求出一定范围内的所有素数

p3912 素数个数

int pri[maxn],cnt=0;

void getprime(int n){//暴力求法

for(int i=2;i<=n;i++){

int flag=1;

for(int j=2;j<i;j++){

if(i%j==0){flag=0;break;}

}

if(flag) pri[cnt++]=i;

}

}

埃氏筛法

思想:素数的倍数一定不是素数

局限:每个合数会被多次筛去:24会被2,3筛去

const int maxn=100;

bool isprime[maxn];

int pri[maxn],cnt=0;

void getprime(int n){

for(int i=1;i<=n;i++) isprime[i]=1;

isprime[0]=isprime[1]=0; //初始化

for(int i=2;i<=n;i++){ //枚举n

if(isprime[i]){ //判断是否为素数的倍数

for(int j=i*i;j<=n;j+=i){

isprime[j]=0; //更改标记

}

}

}

for(int i=2;i<=n;i++){

if(isprime[i])

pri[cnt++]=i;

}

}

线性筛法(欧拉筛):一种可以保证所有数只被筛去一次的筛法,时间复杂度为O(n)。

欧拉筛的难点就在于对if (i % prime[j] == 0)这步的理解,当i是prime[j]的整数倍时,记 m = i / prime[j],那么 i * prime[j+1] 就可以变为 (m * prime[j+1]) * prime[j],这说明 i * prime[j+1] 是 prime[j] 的整数倍,不需要再进行标记(在之后会被 prime[j] * 某个数 标记),对于 prime[j+2] 及之后的素数同理,直接跳出循环,这样就避免了重复标记。

bool judge[maxn];//判断是否为合数

const int maxn=100;

int pri[maxn],cnt=0;

void getprime(int n){

for(int i = 2;i<=n;i++){

if(!judge[i])

pri[cnt++] = i; //记录素数

for(int j = 0;j<cnt;j++){

if(i*pri[j]>n)break; //判断是否越界

judge[i*pri[j]] = 1; //标记合数

if(i%pri[j]==0)break; //关键:当合数进入循环就退出,内层循环只进行一次,减少时间复杂度

}

}

}

区间素数筛

P1835 素数密度

typedef long long ll;

const int maxn = 1000005;

bool is_prime[maxn]; //偏移后判断素数的数组,脚标从0开始

bool is_prime_small[maxn]; //筛选[2,sqrt(b))中所有的素数

ll prime[maxn]; //记录区间中的素数

ll prime_num=0; //区间素数下标

//对区间[a,b)内的整数执行筛法,is_prime[i-a]=true — 表示i是素数 注意这里下标偏移了a,所以从0开始。

void segment_sieve(ll a,ll b) {

for(ll i=0;i*i<b;++i) is_prime_small[i]=true; //对[2,sqrt(b))的初始化全为质数

for(ll i=0;i<b-a;++i) is_prime[i]=true; //对下标偏移后的[a,b)进行初始化

for(ll i=2;i*i<b;++i) {

if(is_prime_small[i]) {

for(ll j=2i;jj<b;j+=i) is_prime_small[j]=false; //筛选[2,sqrt(b));

//(a+i-1)/i得到最接近a的i的倍数,最低是i的2倍,然后筛选

for(ll j=max(2LL,(a+i-1)/i)*i;j<b;j+=i) is_prime[j-a]=false;

}

}

for(ll i=0;i<b-a;++i) //统计个数,prime_num 即为[a,b)区间素数个数,prime[]存储素数是哪些

if(is_prime[i]) prime[prime_num++]=i+a;

}


唯一分解定理


算术基本定理):任意大于1的整数可以表示成质数的乘积。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9P47Hi1j-1628948300609)(C:\Users\86138\AppData\Roaming\Typora\typora-user-images\image-20210813174940598.png)]

判断数字n的因子有哪些,只需要枚举到sqrt(n)即可

判断n范围内哪些数字能够成为因子,只需枚举到n/2即可

//唯一分解定理

const int maxn = 10000 + 7;

int prime[maxn],len,n,num; //prime:质数

int p[maxn],q[maxn]; //p:因子 q:幂次

bool judge[maxn];

void isPrime(){//素数打表

len = 0;

memset(judge,0,sizeof(judge));

judge[1] = 1;

for(int i = 2;i<=maxn;i++){

if(!judge[i])

prime[len++] = i;

for(int j = 0;j<len;j++){

if(i*prime[j]>maxn)break;

judge[i*prime[j]] = 1; //标记不合法

if(i%prime[j]==0)break;

}

}

}

void Split(int k){//分解

memset(p,0,sizeof§);

memset(q,0,sizeof(q));

for(int i = 0;i<len;i++){

while(k%prime[i]==0){ //能被分解

if(!p[num])p[num] = prime[i];

q[num]++;

k/=prime[i];

}

if(p[num])num++;

if(k==1)break;//退出条件是变为1

}

}

int main()

{

isPrime();

while(scanf(“%d”,&n)!=EOF){

num = 0;

Split(n);

printf("%d = ",n);

for(int i = 0;i<num;i++){

if(i!=0)printf(“*”);

printf(“%d^%d”,p[i],q[i]);

}

printf(“\n”);

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

img
img

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V:vip1024b 备注Java获取(资料价值较高,非无偿)
img

面试资料整理汇总

成功从小公司跳槽进蚂蚁定级P7,只因刷了七遍这些面试真题

成功从小公司跳槽进蚂蚁定级P7,只因刷了七遍这些面试真题

这些面试题是我朋友进阿里前狂刷七遍以上的面试资料,由于面试文档很多,内容更多,没有办法一一为大家展示出来,所以只好为大家节选出来了一部分供大家参考。

面试的本质不是考试,而是告诉面试官你会做什么,所以,这些面试资料中提到的技术也是要学会的,不然稍微改动一下你就凉凉了

在这里祝大家能够拿到心仪的offer!
**
[外链图片转存中…(img-nRafono5-1711534675711)]
[外链图片转存中…(img-RCs2GqpU-1711534675712)]
[外链图片转存中…(img-1c4kekFF-1711534675713)]
[外链图片转存中…(img-55f82EKx-1711534675713)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

[外链图片转存中…(img-UlEFHdzl-1711534675714)]
[外链图片转存中…(img-Fyzc0kLp-1711534675715)]

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V:vip1024b 备注Java获取(资料价值较高,非无偿)
[外链图片转存中…(img-vOlrXmXj-1711534675715)]

面试资料整理汇总

[外链图片转存中…(img-m1JsswSb-1711534675716)]

[外链图片转存中…(img-RsELSAS9-1711534675716)]

这些面试题是我朋友进阿里前狂刷七遍以上的面试资料,由于面试文档很多,内容更多,没有办法一一为大家展示出来,所以只好为大家节选出来了一部分供大家参考。

面试的本质不是考试,而是告诉面试官你会做什么,所以,这些面试资料中提到的技术也是要学会的,不然稍微改动一下你就凉凉了

在这里祝大家能够拿到心仪的offer!

  • 20
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值