【基础】
c/c++常用头文件:
#include#include#include
using namespacestd;#define N 100001 快速排序函数:
sort:bool compare(int x,inty)
{//>是从大到小,
return x>y;
}
sort(b,b+m,compare); //默认从小到大
全排列函数:
#include#include
using namespacestd;intmain()
{int ans[4]={1,2,3,4};
sort(ans,ans+4);do{for(int i=0;i<4;i++)
cout<
cout<
}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 Zz6. 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
intmain()
{inti,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...intmain()
{inti;for(i=1; i<100; i++){if(i%2==0) //填空
printf("%d \n", i*i/2);elseprintf("%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(intn) {if (n <= 1) returnn;if (memo[n] != 0) returnmemo[n];else return memo[n] = fib(n-1) + fib(n-2);
}2.全排列n个元素(非常好用)//k:当前交换位置与其后元素交换
public static void f(char[] data, intk){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, intb) {if (b == 0) returna;else return gcd(b, a %b);
}4.埃氏筛法(搜索n以内的所有素数)int prime[MAX_N];//第i个素数
bool is_prime[MAX_N + 1];//返回n以内素数的个数
int sieve(intn) {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;
}
}returnp;
}5.快速幂运算(反复平方法)//计算:x^n % mod
int mod_pow(int x, int n, intmod) {int res = 1;while (n > 0) {if (n & 1)
res= res * x %mod;
x= x * x %mod;
n>> = 1;
}returnres;
}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 longb){long long res=1;while(b!=0){if (b%2==1) res*=(a%n);
a=a*(a%n);
b/=2;
}returnres;
}9.但是当数据量大于10^19时,longlong会爆,所以利用快速乘法,原理类似,a*b就是b个a相加,将b表示为二进制:intn;long long mul(long long a,long longb){long long res=0;while(b!=0){if(b%2==1) res=(res+a%n)%n;
a=(a%n+a%n)%n;
b/=2;
}returnres;
}long long quick_mod(long long a,long longb){long long res=1;while(b!=0){if (b%2==1) res=mul(res,a)%n;
a=mul(a,a);
b/=2;
}returnres;
}10.唯一分解定理:
又称为正整数的唯一分解定理,即:每个大于1的自然数均可写为质数的积,而且这些素因子按大小排列之后,写法仅有一种方式。
所以一个数可以表示成一个已知质数数组(刷选法得到)得到的数组e,e里面存各个质数的指数,比如15表示为e{1,1,0,0...}的方式;void fenjie(intn){for(int i=0;i
n/primes[i];
e[i]++;
}if (n==1) break;
}
}