@nlogn
2019-01-22T17:55:23.000000Z
字数 2520
阅读 781
内容:
若为质数,且,那么
那么:
在意义下的乘法逆元就是。
那么如何快速求解幂呢?
两种方法:
若为偶数,那么
求解,
当且仅当
求解
若,那么令,原方程可化为,等式成立
我们知道
那么我们设。
类比:
得到:
所以求的解。
一个数的因子总是成对出现,所以我们判断质数时枚举到即可。
bool Is_prime(int n);
{
if(n==1)return false;
if(n==2||n==3||n==5||n==7)return true;
for(register int i=2;i*i<=n;i++)
if(n%i==0)return false;
return true;
}
一个质数的倍数一定不是质数。
#include<cstring>
#include<cmath>
const int MAXN=1000010;
bool prime[MAXN];
void make_prime)()
{
memset(prime,true,sizeof(prime));
prime[0]=prime[1]=false;
int t=sqrt(MAXN);
for(register int i=2;i<=t;i++)
{
if(prime[i])
{
for(register int j=2*i;j<MAXN,j+=i)
{
prime[j]=false;
}
}
}
return;
}
#include<cstring>
#incldue<cmath>
const int MAXN=1000010;
bool prime[MAXN];
int Prime[MAXN];
int num=0;
void make_prime()
{
memset(prime,true,sizeof(prime));
prime[0]=prime[1]=false;
for(int i=2;i<=MAXN;i++)
{
if(prime[i])
{
Prime[num++]=i;
}
for(int j=0;j<num&&i*Prime[j]<MAXN;j++)
{
prime[i*Prime[j]]=false;
if(!(i%Prime[j]))
break;
}
}
return;
}
用prime[MAXN]
标记一个数是不是素数,Prime[MAXN]
表示质数有哪些。
如果我们发现prime[i]
为真,那么存储质数的Prime[]
就要存储进一个新数i
。
inline long long gcd(long long a,long long b){//O(log n)
return (!b)?a:gcd(b,a%b);
}
inline long long lcm(long long a,long long b){//O(log n)
return a/gcd(a,b)*b/gcd(a,b);
}
inline long long mod(long long a,long long b,long long p){
return (a%p+b)%p;
}//O(1)
inline void ex_gcd(int a,int b,int &c,int &x,int &y){
if(!b)c=a,x=1,y=0;
else{
ex_gcd(b,a%b,c,y,x);
y-=x*(a/b);
}
}
inline long long quick_power1(long long a,long long b,long long p){
long long ans=1;
for(;n;n>>=1,a=a*a%p)if(n&1)res=res*a%p;
return res;
}//二进制快速幂 O(log n)
inline long long quick_power2(long long a,long long b,long long p){
if(n==0)return 1;
if(n%2==0){
long long x=quick_power2(a,n/2,p);
return x*x%p;
}
else return a*quick_power2(a,n-1,p);
}//分治快速幂 O(log n)
inline long long INV_ALL(long long a,long long long p){
long long GCD,tmp,res;
ex_gcd(a,p,GCD,res,tmp);
return mod(res,p,p);
}
inline long long INV_PRIME(long long a,long long p){
return quick_power1(a,p-2,p);
}
inline void Euler(){
const int MAXN=1000010;
bool prime[MAXN];
int Prime[MAXN],num=0;
memset(prime,true,sizeof(prime));
prime[0]=prime[1]=false;
for(int i=2;i<=MAXN;i++){
if(prime[i])Prime[num++]=i;
for(int j=0;j<num&&i*Prime[j]<MAXN;j++){
prime[i*Prime[j]]=false;
if(!(i%Prime[j]))break;
}
}
return;
}//欧拉筛
未完。。。