【基础】
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、数学:线段交点、多角形面积公式等
*/
来源:oschina
链接:https://my.oschina.net/u/4292207/blog/3601132