欧几里得 :
定义:
在数论中,对于正整数N,少于或等于N ([1,N]),且与N互质的正整数(包括1)的个数,记作φ(n)。
φ函数的值:
φ(x)=x(1-1/p(1))(1-1/p(2))(1-1/p(3))(1-1/p(4))…..(1-1/p(n)) 其中p(1),p(2)…p(n)为x
的所有质因数;x是正整数; φ(1)=1(唯一和1互质的数,且小于等于1)。注意:每种质因数只有一个。
代码:单个
int oula(int n) { int rea=n; for(int i=2; i<=n; i++) if(n%i==0)//第一次找到的必为素因子 { rea=rea-rea/i; do n/=i;//把该素因子全部约掉 while(n%i==0); } return rea; }
代码:多个
for(i=1; i<=maxn; i++) p[i]=i; for(i=2; i<=maxn; i+=2) p[i]/=2; for(i=3; i<=maxn; i+=2) if(p[i]==i) { for(j=i; j<=maxn; j+=i) p[j]=p[j]/i*(i-1); }
判断是否为素数
欧拉筛法:
bool flag[N]; int que[N]; int r; void init(){ for(ri i=2;i<=n;i++) { if(!flag[i]) que[++r]=i; for(ri j=1;j<=r;j++) { if(que[j]*i>n) break ; flag[que[j]*i]=1; if(i%que[j]==0) break; } } }
大整数取mod(防止爆炸longlong)
#define LL long long int LL mul(LL a, LL b, LL p) //a*b%p { LL rn=0, i; for(i=1; i<=b; i<<=1,a=(a<<1)%p) if(b&i) rn=(rn+a)%p; return rn; } // 计算大整数的模乘法
a 为 p 的个数
因子的个数:(a1+1)*(a2+1)*......(an+1);
最大公约数:
long long gcd(int a,int b) { while(a%b!=0) { int aa=a; a=b; b=aa%b; } return b; }
最大公倍数 = a*b / gcd
进制转化
写一个函数,使它能完成将一个十进制的数转换为其他进制的功能。
给出两个整数,a,b
表示要将十进制整数a转换为b进制。
0<=a<=1000000,2<=b<10
十进制数a转换为b进制的方法是a不断的整除b,将余数列出来,直到商为0。然后将之前列出的余数倒序输出,得到b进制的结果。
比如13转化为2进制:
13 / 2 = 6 余数为 1
6 / 2 =3 余数为0
3 / 2 =1 余数为1
1 / 2= 0 余数为 1
此时商为0,结束这一过程。将余数倒序输出:得到1101,即为13的2进制。
#include <bits/stdc++.h> using namespace std; void jjz(int a,int b) { if(a/b==0) { printf("%d",a%b); return ; }else { jjz(a/b,b); printf("%d",a%b); return ; } } int a,b,c,d; int main(){ scanf("%d%d",&a,&b); jjz(a,b); return 0; }