模板:数学1

来源:互联网 发布:网络餐饮 编辑:程序博客网 时间:2024/04/27 23:20

判断素数:

int isprime(int n){    if(n==2||n==3)        return 1;    if(n%6!=1&&n%6!=5)        return 0;    for(int i=5;i*i<=n;i+=6)        if(n%i==0||n%(i+2)==0)            return 0;    return 1;}

素数打表:

const int maxn=1001005;ll p[maxn];      //第 i 个质数bool pp[maxn];   //记录是不是质数,质数为0ll get_prime(){    ll pnum=0;    for(ll i=2;i<=maxn;i++){        if(!pp[i])            p[pnum++]=i;        for(ll j=0;j<pnum&&p[j]*i<=maxn;j++){            pp[p[j]*i]=1;            if(i%p[j]==0)                break;        }    }    pp[0]=1;    pp[1]=1;    return pnum;}

找素因子:

int su[maxn],cnt;void suyinzi(ll x){    cnt=0;    for(int i=2;i<=sqrt(x);i++){        if(x%i==0)        su[cnt++]=i;        while(x%i==0)        x/=i;    }    su[cnt++]=x;}

梅森素数:

p为素数,并且M=2^p-1也为素数,则M为梅森素数,

利用Lucas-Lehmer法判定:

ll multi(ll a, ll b, ll m){//用加法实现a * b % m的操作,防止溢出    ll ans = 0;      while(b > 0){          if(b & 1)  ans = (ans+a) % m;          b >>= 1;          a = (a<<1) % m;      }      return ans;  }  //判断是否是梅森素数  bool is_msPrime(int p){      ll r[70];      ll m = 1;      m <<= p;  m -=1;//求出Mp;      r[1] = 4ll;     //注意转化为ll    if(p == 2)  return true;      for(int i = 2; i <= p-1; ++i)          r[i] = (multi(r[i-1],r[i-1],m)-2) % m;      if(r[p-1] == 0)  return true;      return false;  }  //位数为p,梅森数可以这么表示:misen=1;misen<<=p;misen--;  //表示2^p

gcd:

ll gcd(a,b){  //大小无所谓,可以自动换    return b==0?a:gcd(b,a%b);}//扩展gcd,除了求出a和b的最大公约数d,还能求出x,y 使ax+by=d//别忘了需要改变的是地址值void gcd(ll a,ll b,ll &d,ll &x,ll &y){    if(!b){d=a;x=1;y=0;}    else{ gcd(b,a%b,d,y,x);y-=x*(a/b);}}//乘法逆元//余数系Zn:Z15中的元素3表示:模5==3(如3,8,13,18...)//特别的如果Zn中的两个元素a,b,有ab=1,则称a b互为乘法的逆。写作 a*b % n =1ll inv(ll a,ll n){    ll d,x,y;    gcd(a,n,d,x,y);    return d==1? (x+n)%n:-1;}

求组合数C(n,m):

void C(ll n,ll m){  //C(n,m),m里选n个。    ll ans,a=1,b=1;    for(ll i=m;i>=m-n+1;i--)        a=a*i%mod;    for(ll i=n;i>1;i--)        b=b*i%mod;    ans=a*inv(b,mod)%mod; //ans=a*get_pow(b,mod)%mod;    return ans;}

汉诺塔:

void move(char A,char B){      cout<<A<<"-->"<<B<<endl;  }  void hanoi(int n,char A,char B,char C){      if(n==1)          move(A,C);      else{          hanoi(n-1,A,C,B);          move(A,C);          hanoi(n-1,B,A,C);      }  }  


 
原创粉丝点击