经典模板

1.素数

// 判断素数  
bool isPrime(int num)  
{  
    if (num == 2 || num == 3)  
    {  
        return true;  
    }  
    if (num % 6 != 1 && num % 6 != 5)  
    {  
        return false;  
    }  
    for (int i = 5; i*i <= num; i += 6)  
    {  
        if (num % i == 0 || num % (i+2) == 0)  
        {  
            return false;  
        }  
    }  
    return true;  
}  
判断素数

 

/*
    |埃式筛法|
    |快速筛选素数|
*/

int prime[maxn];  
bool is_prime[maxn];

int sieve(int n){
    int p = 0;
    for(int i = 0; i <= n; ++i)
        is_prime[i] = true;
    is_prime[0] = is_prime[1] = false;
    for (int i = 2; i <= n; ++i){   //  注意数组大小是n
        if(is_prime[i]){
            prime[p++] = i;
            for(int j = i + i; j <= n; j += i)  //  轻剪枝,j必定是i的倍数
                is_prime[j] = false;
        }
    }
    return p;   //  返回素数个数
}
素数筛法
int isPrime_sieve(int n){  
    int* isPrimes = (int*)malloc(sizeof(int)*(n+1));  
    int i,j;  
    int sqrtn = sqrt(n);  
  
    if(n<=1)  
        return 0;  
  
    for(i=2;i<=n;i++){       //初始化都为素数  
        isPrimes[i] = 1;  
    }  
  
    //从2开始,将素数的倍数标记为非素数  
    //从i的平方开始标记即可,不需要从i*j(且j<i)开始,因为i*j至少在遇到j时已经被标记过了  
    for(i=2;i<=sqrtn;i+=1){    
          
        if(isPrimes[i]==0)  //不是素数,说明i可以分解为两个因子相乘,那么在遇到这两个因子的较小者时,i的倍数已经被标记过  
            continue;  
  
        for(j=i*i;j<=n;j+=i){    //j是i的倍数  
            isPrimes[j] = 0;  
        }  
    }  
  
    return isPrimes[n];  
}  
素数筛法2

 

2.快速幂

/*快速幂取模*/
typedef long long LL;
LL pow(LL x, LL n, LL m)
{
    LL ans=1;
    while(n)
    {
        if(n&1)
            ans=(ans*x)%m;
        x=(x*x)%m;
        n>>=1;
    }
    return ans;
}
快速幂取模

 

3.全排列

#include<stdio.h>  
#include<string.h>  
#include<string.h>  
#include<algorithm>  
#include<iostream>  
#include<map>  
using namespace std;  
string a[100000];  
char b[50];  
int cmp(char a,char b)  
{  
    return a<b;  
}  
int main()  
{  
    int i,j,sum=1,len;  
    scanf("%s",b);  
    len=strlen(b);  
    sort(b,b+len,cmp);  
    do  
    {  
        printf("%s\n",b);  
    }while(next_permutation(b,b+len));  
    return 0;  
}     
51nod 1384 全排列next法

 

4.星期公式

int solve(int yy,int mm,int dd)
{
    int m[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};
    if(mm==0||mm>12||dd==0||dd>31)
    {
        return -1;
    }
    if(!((yy%4==0)||yy%400==0))
        m[2]=28;
    else
        m[2]=29;
    if(dd>m[mouth])
    {
        return -1;
    }
    if(mm<3)
    {
        yy--;
        mm+=12;
    }
    int c=yy/100;
    int y=yy%100;
    return (((c/4-2*c+y+y/4+13*(mm+1)/5+dd-1)%7+7)%7);
}
蔡勒公式

 

5.矩阵相关

typedef long long ll;  
const int N = 2;  
struct Matrix  
{  
    ll mat[N][N];  
};  
Matrix operator * (Matrix a,Matrix b)  
{  
    Matrix c;  
    for (int i = 0;i < N;++i)  
    {  
        for (int j = 0;j < N;++j)  
        {  
            c.mat[i][j] = 0;  
            for (int k = 0;k < N;++k)  
            {  
                c.mat[i][j] += a.mat[i][k]*b.mat[k][j];  
            }  
        }  
    }  
    return c;  
}  
n*n矩阵乘法

 

posted @ 2017-10-06 20:24  Roni_i  阅读(248)  评论(0编辑  收藏  举报