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.快速幂
/*快速幂取模*/ 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 ",b); }while(next_permutation(b,b+len)); return 0; }
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; }