1、文本输入、输出
void fre(){
freopen("C:\\Users\\acm\\Desktop\\输入文本.txt", "r", stdin);
freopen("C:\\Users\\acm\\Desktop\\输出文本.txt", "w", stdout);
} //注意都是双\
2、数组去重
Eg:1 2 2 3 4 =》 1 2 3 4 2
int b[N];
sort(b,b+N);
int len = unique(b, b + n) - b;//返回的是4的位置
3、GCD、LCM
int gcd(int a,int b){ return b?gcd(b,a%b):a;} //最大公约数
lcm = a * b / gcd(a,b) //最小公倍数
4、字符串《=》整型
sscanf(s,"%d",&n);//从字符串s中读入整数n
sprintf(s,"%d",n);//将n转换为字符串s
5、getchar()读入转str
while ((x1[0] = getchar()) && x1[0] != '\n'){
int len1 = 1;
while ((x1[len1] = getchar()) && x1[len1] != ' ')len1++;
x1[len1] = '\0';
string s1 = x1;
}
6、char【】转int
char s[100];
int x=atoi(s);
7、同余
(a+b)%m=(a%m)+(b%m)
(a-b)%m=(a%m)-(b%m) //稍微留意负数情况
(a*b)%m=(a%m)*(b%m)
m^n%c=(m%c)^n%c;
8、求n!的位数
1.暴力
for(int i=2;i<=n;i++)
Len+=log10(i*1.0);
ans=(int)len+1;
2.斯特林公式
=》这里求到的数和原本的实际值相差不大,故求位数不影响
len=0.5*log10(2*3.1415927*n)+n*log10(n/2.718281828459);
ans=(int)len+1;
9、容斥原理
N个方格m种颜色问有多少种染色发:
设F(m)为在n个方格上使用m种颜色任意染色的方案数
F(m)=m^n,使用快速幂求一次F(m)的时间为O(log(n))
Ans=C(m,m)F(m)-C(m,m-1)F(m-1)+C(m,m-2)F(m-2)-C(m,m-3)F(m-3)+……
用杨辉三角预处理出C(m,n)花费O(m^2)
总时间复杂度为O(m^2+mlog(n))
10、Log与自然对数e
Log(x)表示ln(x) ,其他例如:log10(x) ,log2(x),用exp(x)来表示e^x
11、快速幂
long long Pow(long long a,long long n){
long long ret=1;
while(n){
if(n&1)ret*=a;
a*=a;
n>>=1;
}
return ret;
}
long long Mod_Pow(long long a,long long n,long long mod){
long long ret=1;
while(n){
if(n&1)ret=(ret*a)%mod;
a=(a*a)%mod;
n>>=1;
}
return ret;
}
12、求1到n的数的异或和O(1)
unsigned xor_n(unsigned n){
unsigned t = n & 3;
if (t & 1) return t / 2u ^ 1; //照着打就行,u默认为unsigned int
return t / 2u ^ n;
}
13、卡特兰数
Eg:给定一个凸n边形,问将其划分成三角形的方法数
1,1,2,5,14,42,132….
h(n)=h(n-1)*(4*n-2)/(n+1)
h(n)=C(2n,n)/(n+1)
h(0)=1
14、错排公式
Eg:给定n种颜色篮子和n种颜色球,求全放错情况数
D(n)=(n-1)*(D(n-2)+D(n-1))
D(1)=0,D(2)=1
15、素数
&#x