数论基础

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

ACM初步数论基础组合 qsort

1.任意整数m可分解为素数的多次方幂:

m=p1^t1 * p2^t2 * p3^t3 ....

2.m共有(t1+1)(t2+1)...个因子;

3.Proper Divisor sum 叫做真因子和(含一但除去数本身).

3.欧拉函数Eula(m)是1~ (m-1)中与m互素的数的个数;

4.m是素数则: Eula(m)=m-1; 欧拉函数是积性函数

5.如果:m=p^t,且p是素数,则Eula(p^t)=p^t-p^(t-1);

6.如果:m=p1^t1 * p2^t2 * p3^t3 ....

则:Eula(m)=(p1^t1-p1^(t1-1))*...( pn^tk - pn^(tk-1) );

7.十万下素数有9592个,五万下有5133个,100万下有7900个;

∑ 是包括它自己的叫因子和.素数∑p=p+1;

∑p^2= 1+p+P^2, ∑p^n=1+p+p^2+P^3+...P^n;

∑是积性函数. ∑(m*n)= ∑(m)* ∑(n);

8.m的因子和:E(m)=E(p1^t1)*...E(pn^tn);

E(p^t)=1+p+..p^t;

m的因子个数=(t1+1)*(t2+1)*...*(tn+1)

9.INT_MAX=2147483647=2^31-1;

INT_MIN=2^-31;

10.P=Eula(m),则a^P=1(mod m);

11. Mersenne Numbers 如果 P是素数.2^P-1就是Mersenne Number

12.

A是m*n矩阵,

B是n*s矩阵,

C是A*B矩阵,

则C为m*s矩阵;

运算量=m*n*s

C (i,j)=∑A(i,k)*B(k,j) [k=1 ~ n]

A x =

B (mod) L

D=(A,L); 如果B % D = 0 就有解.

A / = D ;

B / = D; L / = D ;

15 x = 20 (mod) 100;

3 x =

4 (mod) 20 ;

如果 gcd(A,L)=1; f = EU (L) ;则 A^f = 1 (mod)L;

==>

A x = B; A*A^(f-1)*x = A^(f-1)*B

X =A ^ (f-1) * B;

//最大公因数gcd a=b*x+a%b gcd(a,b)=gcd(b,a%b)

int gcd(int n,int m){ // gcd(n,m)==gcd(m,n%m)

int t;

if(m==0)return n;

while(n%m!=0){

t=n%m;

n=m;

m=t;

}

return m;

}

void gcd(int a,int b,int &d,int &x,int &y) //scl 3.1 {

if(b==0){d=a;x=1;y=0; return;} //xa+yb=d; x+=b;y-=a; gcd(b,a%b,d,y,x);

y-=x*(a/b);

}

最小公倍数 lcu(a,b)

int lcu(int a,int b)

{int m;

if(a

{

m=a;a=b;b=m;

}

m=a;

while(m%b!=0)m+=a;

return m;

}

ab=gcd(a,b)*lcu(a,b)

#include

#include

#define maxn 10000000

#define maxp 1000000

char mk[maxn];

int prime[maxp],pnum;

void GenPrime(int n)

{

int i,j,k;pnum=0;

memset(mk,0,sizeof(mk));

for(i=2,k=4;i<=n;i++,k+=i+i-1)if(!mk[i])

{prime[pnum++]=i; //k=i*i;

if(k<=n&&k>0) //&&k>0 是增加的

{

for(j=i+i;j<=n;j+=i)mk[j]=1;

}

}

/*

i= 2 3 4 5 6 7

k= 4 9 16 25 36 49

*/

}

int main()

{int n;

n=100000;

GenPrime(n);

printf("%d\n",pnum);

while(1)

{ scanf("%d",&n);;

printf("%d\n",prime[n]);

}

}

//计算<=M的素数,<=M的素数有 prime[0]个

// M=100000, prime[0]=9592

void PRIME(){

int i,j,k=2,flag,M=100000;

prime[1]=2;

prime[2]=3;

for(i=5;i<=M;i++){

flag=1;

for(j=1;prime[j]*prime[j]<=i;j++)

if(i%prime[j]==0){

flag=0;break;

}

if(flag)prime[++k]=i;

}

prime[0]=k;

}

//用筛选法求素数

bool bl[100001];

void PRIME(){

int i,j,i2,k,M=100000,N=(int)sqrt((double)M); for(i=0;i<=M;i++)bl[i]=0,bl[++i]=1;

bl[1]=0;bl[2]=1;

for(i=3;i<=N;i++)

if(bl[i]){

相关文档
最新文档