总结
如果你选择了IT行业并坚定的走下去,这个方向肯定是没有一丝问题的,这是个高薪行业,但是高薪是凭自己的努力学习获取来的,这次我把P8大佬用过的一些学习笔记(pdf)都整理在本文中了
《Java中高级核心知识全面解析》
小米商场项目实战,别再担心面试没有实战项目:
(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))。
方程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
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)
利用素数来解决问题,如何求出一定范围内的所有素数
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; //关键:当合数进入循环就退出,内层循环只进行一次,减少时间复杂度
}
}
}
区间素数筛
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的整数可以表示成质数的乘积。
判断数字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”);
}
return 0;
}
优化:
根据求因子条件,素数只枚举到prime[i]*prime[i]<=n , 最后若n>1就说明还剩下一个一次方的素数。
原因:
若n%prime[i]==0,则n = prime[i] * q , 然后我们把n里面的prime[i]因子除尽以后,n = 1* k , n就变成了一个新的数字,因为我们的素数枚举是从小到大的,小的除尽了,如果k是一个合数,那么肯定能拆成素数乘积,而且这个素数是肯定>prime[i]的,也一定满足prime[j]prime[j] <=n是能继续拆的;另一方面,如果只剩下一个素数,就不会满足prime[j]*prime[j]<=n了,所以这种方法是可行的。
//优化:
//根据求因子条件,素数只枚举到prime[i]*prime[i]<=n , 最后若n>1就说明还剩下一个一次方的素数
void Split(int k){
memset(p,0,sizeof§);
memset(q,0,sizeof(q));
for(int i = 0;i<len&&prime[i]*prime[i]<=k;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){p[num] = k;q[num++]++;}//结尾判断
}
//直接分解法(不用素数打表)
void Split(int k){
memset(p,0,sizeof§);
memset(q,0,sizeof(q));
for(int i = 2;i*i<=k;i++){
while(k%i==0){
if(!p[num])p[num] = i;
q[num]++;
k/=i;
}
if(p[num])num++;
}
if(k>1){p[num] = k;q[num++]++;}
}
应用:
欧拉函数求互质
欧拉公式的延伸:一个数的所有质因子之和是 euler(n)*n/2;
//欧拉函数,在分解质因数的同时求得欧拉函数
//①直接求小于或等于n,且与n互质的数个数:
inline int euler_one(int n)
{
int ans = n;
for(int i = 2; i * i <= n; ++ i){
if(n % i == 0){ //合数
ans = ans / i * (i - 1); //公式
while(n % i == 0)n /= i; //n除因子改变n
}
}
if(n > 1)ans = ans / n * (n - 1); //还能分解一个质因子
return ans;
}
//②求[1,n]之间每个数的质因数的个数
首先,要明确一些性质,下面三条性质我们会在欧拉函数线性筛中使用到。
1.如果p为素数,则φ§=p-1;
2.若a为n的质因子,且(n%a0&&(n/a)%a0),即如果a是n的多重质因子,则φ(n)=φ(n/a)*a;
3.若a为n的质因子,但(n%a==0&&(n/a)%a! =0),即如果a是n的单质因子,则φ(n)=φ(n/a)*(a-1);
//线性筛欧拉函数建立在线性筛素数的基础之上
void getPhi()
{
phi[1] = 1;//存欧拉函数值
cnt = 0;
for(int i = 1; i < MAXN; i++)
isprime[i] = 1;
for(int i = 2; i < MAXN; i++)
{
if(isprime[i])
{
prime[cnt++] = i; //记录素数
phi[i] = i - 1; //记录欧拉函数值 性质1
}
for(int j = 0; j<cnt&&prime[j]*i<MAXN; j ++) //素数筛
{
isprime[i*prime[j]] = 0; //合数
if(i%prime[j] == 0)
{
phi[i*prime[j]] = phi[i] * (prime[j]);
//如果a是n的多重质因子,则φ(n)=φ(n/a)*a
break;
}
else
{
phi[iprime[j]] = phi[i]( prime[j] - 1 );
//即如果a是n的单质因子,则φ(n)=φ(n/a)*(a-1)
}
}
}
}
//如何求一个数约数的个数
void getDiv()
{
for(int i = 1; i < MAXN; i++)
isprime[i] = 1;
for(int i = 2; i < MAXN; i++)
{
if(isprime[i])
{
prime[cnt++] = i;
minp[i] = 1; //质数的最小质因子为其本身,数量为1
divnum[i]= 2;//质数的约数为1和它本身
}
for(int j = 0; j < cnt&&i*prime[j] < MAXN; j++) //线性筛
最后
分享一套我整理的面试干货,这份文档结合了我多年的面试官经验,站在面试官的角度来告诉你,面试官提的那些问题他最想听到你给他的回答是什么,分享出来帮助那些对前途感到迷茫的朋友。
面试经验技巧篇
- 经验技巧1 如何巧妙地回答面试官的问题
- 经验技巧2 如何回答技术性的问题
- 经验技巧3 如何回答非技术性问题
- 经验技巧4 如何回答快速估算类问题
- 经验技巧5 如何回答算法设计问题
- 经验技巧6 如何回答系统设计题
- 经验技巧7 如何解决求职中的时间冲突问题
- 经验技巧8 如果面试问题曾经遇见过,是否要告知面试官
- 经验技巧9 在被企业拒绝后是否可以再申请
- 经验技巧10 如何应对自己不会回答的问题
- 经验技巧11 如何应对面试官的“激将法”语言
- 经验技巧12 如何处理与面试官持不同观点这个问题
- 经验技巧13 什么是职场暗语
面试真题篇
- 真题详解1 某知名互联网下载服务提供商软件工程师笔试题
- 真题详解2 某知名社交平台软件工程师笔试题
- 真题详解3 某知名安全软件服务提供商软件工程师笔试题
- 真题详解4 某知名互联网金融企业软件工程师笔试题
- 真题详解5 某知名搜索引擎提供商软件工程师笔试题
- 真题详解6 某初创公司软件工程师笔试题
- 真题详解7 某知名游戏软件开发公司软件工程师笔试题
- 真题详解8 某知名电子商务公司软件工程师笔试题
- 真题详解9 某顶级生活消费类网站软件工程师笔试题
- 真题详解10 某知名门户网站软件工程师笔试题
- 真题详解11 某知名互联网金融企业软件工程师笔试题
- 真题详解12 国内某知名网络设备提供商软件工程师笔试题
- 真题详解13 国内某顶级手机制造商软件工程师笔试题
- 真题详解14 某顶级大数据综合服务提供商软件工程师笔试题
- 真题详解15 某著名社交类上市公司软件工程师笔试题
- 真题详解16 某知名互联网公司软件工程师笔试题
- 真题详解17 某知名网络安全公司校园招聘技术类笔试题
- 真题详解18 某知名互联网游戏公司校园招聘运维开发岗笔试题
资料整理不易,点个关注再走吧
否可以再申请
- 经验技巧10 如何应对自己不会回答的问题
- 经验技巧11 如何应对面试官的“激将法”语言
- 经验技巧12 如何处理与面试官持不同观点这个问题
- 经验技巧13 什么是职场暗语
[外链图片转存中…(img-QKB4o32u-1715621312875)]
面试真题篇
- 真题详解1 某知名互联网下载服务提供商软件工程师笔试题
- 真题详解2 某知名社交平台软件工程师笔试题
- 真题详解3 某知名安全软件服务提供商软件工程师笔试题
- 真题详解4 某知名互联网金融企业软件工程师笔试题
- 真题详解5 某知名搜索引擎提供商软件工程师笔试题
- 真题详解6 某初创公司软件工程师笔试题
- 真题详解7 某知名游戏软件开发公司软件工程师笔试题
- 真题详解8 某知名电子商务公司软件工程师笔试题
- 真题详解9 某顶级生活消费类网站软件工程师笔试题
- 真题详解10 某知名门户网站软件工程师笔试题
- 真题详解11 某知名互联网金融企业软件工程师笔试题
- 真题详解12 国内某知名网络设备提供商软件工程师笔试题
- 真题详解13 国内某顶级手机制造商软件工程师笔试题
- 真题详解14 某顶级大数据综合服务提供商软件工程师笔试题
- 真题详解15 某著名社交类上市公司软件工程师笔试题
- 真题详解16 某知名互联网公司软件工程师笔试题
- 真题详解17 某知名网络安全公司校园招聘技术类笔试题
- 真题详解18 某知名互联网游戏公司校园招聘运维开发岗笔试题
[外链图片转存中…(img-gBO6in8M-1715621312876)]
资料整理不易,点个关注再走吧