数论基础
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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]){