【基础】 c/c++常用头文件: #include<iostream> #include<cstring> #include<algorithm> using namespace std; #define N 100001 快速排序函数: sort: bool compare(int x,int y) { //>是从大到小,<从小到大(默认) return x>y; } sort(b,b+m,compare); //默认从小到大 全排列函数: #include<iostream> #include<algorithm> using namespace std; int main() { int ans[4]={1,2,3,4}; sort(ans,ans+4); do{ for(int i=0;i<4;i++) cout<<ans[i]<<" "; cout<<endl; }while(next_permutation(ans,ans+4)); return 0; } 【1】把做过的题好好复习、理解。 1. %.3f保留3位小数并四舍五入; 2. &&的优先级要高与|| &&有点类似于*,||类似于+ 逻辑运算符里!的优先级最高; 3. if(1) if(b) x++; else //else默认和最近的一个if配对 y++; 5. 要记得ACII表中,A为65,a为97; Aa Bb Cc Dd Ee Ff Gg Hh Ii Jj Kk Ll Mm Nn Oo Pp Qq Rr Ss Tt Uu Vv Ww Xx Yy Zz 6. Double类型的数据输入要用%lf,输出用%f就可以了; 7. EOF符号直接指一个空 8. 注意一个数输出的格式,如%.1lf表示double类型保留一位小数输出,而且这个格式默认是四舍五入的; 9. 求a,b两个数的最大公约数,用以下算法 while( b > 0) { int t = a % b; a = b; b = t; },得出的a就是最大公约数了。具体理解用长度不一的棒子模拟。 10.if(fabs(m*my-n*ny)<0.000001) //浮点数判断相等,要近似判断,如果用==得不到结果。fabs(float x)浮点数x的绝对值 来源 蓝桥杯 鸡蛋的数目 【2】基本数学知识汇总 1.质数(prime number)又称素数,有无限个。质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数。 2.互质数为数学中的一种概念,即两个或多个整数的公因数只有1的非零自然数。公因数只有1的两个非零自然数,叫做互质数。 3.模运算 运算规则 模运算与基本四则运算有些相似,但是除法例外。其规则如下: (a + b) % p = (a % p + b % p) % p (1) (a - b) % p = (a % p - b % p) % p (2) (a * b) % p = (a % p * b % p) % p (3) ab % p = ((a % p)b) % p (4) 结合率: ((a+b) % p + c) % p = (a + (b+c) % p) % p (5) ((a*b) % p * c)% p = (a * (b*c) % p) % p (6) 交换率: (a + b) % p = (b+a) % p (7) (a * b) % p = (b * a) % p (8) 分配率: ((a +b)% p * c) % p = ((a * c) % p + (b * c) % p) % p (9) 同余定理 公式入下:例如:1234%10 首先整数都可化成如此形式,如1234化成((1*10+2)*10+3)*10+4 进行求余(((1*10+2)*10+3)*10+4)%10 此时用到两个公式 (a+b)%c=(a%c+b%c)%c (a*b)%c=(a%c*b%c)%c 计算过程比较麻烦,多次正反运用公式最终能得到 1234%10=(((1%10*10+2)%10*10+3)%10*10+4)%10 【高次方数的尾数】 乘法规律发现:乘积的后三位值只与 乘数与被乘数的后三位有关,与乘数和被乘数的高位无关。 【阶乘尾数零的个数】 规律:1-100中 凡是有因子5,尾数就增加一个零;有因子25,尾数就增加两个零。 100!有24个零,1000!有249个零。 #include<stdio.h> int main() { int i,j,k; int num2=0; // 与2相乘的次数 int num5=0; // 与5相乘的次数 for(i=1;i<=100;i++) //100! { j=i; while((j%2)==0) // 对每个数分解,看包含多少个2 { num2++; j=j/2; } j=i; while((j%5)==0) // 对每个数分解,看包含多少个5 { num5++; j=j/5; } } printf("%d\n",(num2>num5?num5:num2)); // 找出2和5相乘次数少的,就是多少个2x5的对,就有多少个0 return 0; } 【大衍数列】 中国古代文献中,曾记载过“大衍数列”, 主要用于解释中国传统文化中的太极衍生原理。 它的前几项是:0、2、4、8、12、18、24、32、40、50、60、72、84... int main() { int i; for(i=1; i<100; i++){ if(i%2==0) //填空 printf("%d \n", i*i/2); else printf("%d \n", (i*i-1)/2); } printf("\n"); } 数字规律:1,3,6,10,,,,, 公式:i*(i+1)/2 【做过有关题的答案】 88*88=7744 四位数中唯一aabb型数 【补充-常识】 一年的12个月:1-12月 31、28/29、31、30、31、30、31、31、30、31、30、31 闰年: (year%4==0&&year%100!=0)||(year%400==0) 【3】API文档的熟悉-常用函数 【4】刷题 【常用算法】 斐波那契(记忆化搜索) int memo[MAX_N + 1]; int fib(int n) { if (n <= 1) return n; if (memo[n] != 0) return memo[n]; else return memo[n] = fib(n-1) + fib(n-2); } 2.全排列n个元素(非常好用) //k:当前交换位置与其后元素交换 public static void f(char[] data, int k){ if (k == data.length) { for (int i = 0; i < data.length; i++) system.out.print(data[i] + " "); system.out.println(); } for (int i = k; i < data.length; i++) { char t = data[k]; data[k] = data[i]; data[i] = t;//试探 f(data, k + 1); char t = data[k]; data[k] = data[i]; data[i] = t;//回溯 } } 3.辗转相除法求最大公约数 int gcd(int a, int b) { if (b == 0) return a; else return gcd(b, a % b); } 4.埃氏筛法(搜索n以内的所有素数) int prime[MAX_N];//第i个素数 bool is_prime[MAX_N + 1]; //返回n以内素数的个数 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++) { if (is_prime[i]){ prime[p++] = i; for (int j = 2*i; j <= n; j += i) is_prime[j] = false; } } return p; } 5.快速幂运算(反复平方法) //计算:x^n % mod int mod_pow(int x, int n, int mod) { int res = 1; while (n > 0) { if (n & 1) res = res * x % mod; x = x * x % mod; n >> = 1; } return res; } 6.筛选法求素数 memset(vis,0,sizeof(vis)); for (int i=2;i<=n;i++){ for (int j=i*2;j<=n;j+=i) vis[j]=1; } //升级版 int m=sqrt(n+0.5); memset(vis,0,sizeof(vis)); for (int i=2;i<=m;i++) if (!vis[i]) for (int j=i*i;j<=n;j+=i) vis[j]=1; 素数定理 不超过x的素数个数近似(略超过) x/lnx; 7.三种求模: (a+b)%n=(a%n+b%n)%n; (a-b)%n=(a%n-b%n+n)%n; a*b%n=a%n*(b%n)%n;//乘法注意不要越界!! 大数例如10的100次方取模: 将大数例如1234表示为(((1*10+2)*10+3)*10+4),然后利用上述公式求结果; 8.快速幂取模,循环实现,原理就是把指数分解为二进制数表示,代码如下: long long quick_mod(long long a,long long b){ long long res=1; while(b!=0){ if (b%2==1) res*=(a%n); a=a*(a%n); b/=2; } return res; } 9.但是当数据量大于10^19时,longlong会爆,所以利用快速乘法,原理类似,a*b就是b个a相加,将b表示为二进制: int n; long long mul(long long a,long long b){ long long res=0; while(b!=0){ if(b%2==1) res=(res+a%n)%n; a=(a%n+a%n)%n; b/=2; } return res; } long long quick_mod(long long a,long long b){ long long res=1; while(b!=0){ if (b%2==1) res=mul(res,a)%n; a=mul(a,a); b/=2; } return res; } 10.唯一分解定理: 又称为正整数的唯一分解定理,即:每个大于1的自然数均可写为质数的积,而且这些素因子按大小排列之后,写法仅有一种方式。 所以一个数可以表示成一个已知质数数组(刷选法得到)得到的数组e,e里面存各个质数的指数,比如15表示为e{1,1,0,0...}的方式; void fenjie(int n){ for(int i=0;i<primes.size();i++){ while(n%primes[i]==0){ n/primes[i]; e[i]++; } if (n==1) break; } }
/*
刷题OJ:
基础:https://login.codevs.com/auth/login
进阶:http://acm.hdu.edu.cn/
蓝桥杯省赛知识点
1、C++ STL 常见算法
2、C++ 输入输出(包括流、文件)
3、C++常用泛型:list vector stack map
4、暴力穷举
5、递归
6、全排列 next_permutation 康托展开式
7、回溯
8、DFS、BFS、hash表
9、数学上的有:辗转相除(两行内),素数等
国赛知识点
1、hash表
2、大数(高精度)加减乘除
3、线段树
4、并查集
5、图论相关算法:最短路(Floyd、Dijstra,BellmanFord)、最小生成树(prim,kruscal要用并查集)
6、熟悉动态规划的各个典型:LCS、最长递增子串、三角剖分、记忆化dp
7、博弈类算法:博弈树,二进制法等。
8、双向广度搜索、A*算法,最小耗散优先
9、数学:线段交点、多角形面积公式等
*/