码迷,mamicode.com
首页 > 其他好文 > 详细

经典模板

时间:2017-10-06 21:24:32      阅读:137      评论:0      收藏:0      [点我收藏+]

标签:while   names   pac   iostream   快速   strlen   perm   分享   continue   

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);
}
蔡勒公式

 

经典模板

标签:while   names   pac   iostream   快速   strlen   perm   分享   continue   

原文地址:http://www.cnblogs.com/Roni-i/p/7632788.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!