ACM技巧——c++笔记

1.for(auto i:v)
这是c++11的新特性,范围for,相当于java的for each。v是一个可遍历的容器或流,比如vector类型,i就用来在遍历过程中获得容器里的每一个元素。

例如:vector v={1,2,3,4};
for(auto i:v)
cout<<i;
结果就是1234

2.while(~scanf("%d", &n))
scanf的返回值是输入值的个数

如果没有输入值就是返回-1

-1按位取反结果是0

while(~scanf("%d", &n))就是当没有输入的时候退出循环
3.费马小定理,快速幂?????
4.对109+7取模(在此之前有点让人头疼,这啥玩意儿,用%做不到,会变double型)
不能用
#define mod 1e9+7
*,因为这个在后面编译就出错了,
例如:
error: invalid operands of types ‘long long int’ and ‘double’ to binary ‘operator%’|,它把mod居然看成了double型的数据

正确的:const long long mod=1e9+7;
同时附上 typedef long long ll;//typedef给复杂的数据类型起别名
const ll mod=1e9+7;定义常量

设正整数x,y,p,求余符号为⊙。
对于加法运算:(x+y)⊙p = (x⊙p+y⊙p)⊙p
对于乘法运算:(x
y)⊙p = [(x⊙p)(y⊙p)]⊙p
4.正多边形里无限次循环取正多边形,每次从每条边的重点开始取下一顶点。求所有边之和 数学
(绝绝子的数学推导,真是要好好学习数学啊)
例题:图案的框架最初是一个正n边形,之后以它的n条边的中点为顶点构成一个新的正n变形。如此重复多次后,就能得到天花板图案的框架了。
不要问重复多少次,问就是无限重复。。。
思路: 我们知道的只有边长和角度,考虑去用三角函数,同时因为每次都是正n边形,所以角度是没有变化的,可以考虑把边长用三角函数的角度去表示。
设a为刚开始时正多边形的边长,内角大小为b,则可数学推出,下一个正多边形的边长为asin(b/2);下下个的边长为(asin(b/2))sin(b/2);每次就是在上一条的基础上乘以那个相同的角度的正弦值,这么看还可以推导成等比数列求和(确实,上机运行过,只要把pow函数里的指数弄大点,时间也只要3ms(又想到了快速幂运算)
5.const double pi=acos(-1)对于精度要求高的题目很好使
6.快读,getchar比scanf快
int read()
{
int res=0,x=1;
char c=getchar();
while(c<‘0’||c>‘9’)
{
if(c==’-’)
x=-1;
c=getchar();
}
while(c>=‘0’&&c<=‘9’)
{
res=res
10+(c-‘0’);
c=getchar();
}
return resx;
}
或者ll read()
{
char c=getchar();
ll ds=0,fs=1;
while (c<‘0’||‘9’<c) {if (c==’-’) fs=-1;c=getchar();}
while (c>=‘0’&&c<=‘9’) ds=(ds<<3)+(ds<<1)+c-48,c=getchar();
return ds
fs;
}
nice又发现个快速输入的东西
void print(int x){
if (x < 0) x = -x, putchar(’-’);
if (x > 9) print(x / 10);
putchar(x % 10 + ‘0’);
}
但是输出换行是用,putchar(’\n)
7.01分数规划,好像都用在极限值附近,有点像函数极值的讨论
8.nice啊发现>>1右移一位就相当于除以了2.这个位运算nice
9.n集合容斥原理
假设有n个集合 A1,A2,…,An (n≥2)

猜想n个集合的容斥关系是否为:

A1∪A2∪…∪An

= A1 + A2 + …+ An ﹣(A1∩A2 + A1∩A3 + …+ A[n-1]∩An) +

(A1∩A2∩A3 + A1∩A2∩A4 + …+ A[n-2]∩A[n-1]∩An) + …+

[(-1)^(n-1)]A1∩A2∩…∩An (注:[n-1],[n-2]为下标;(-1)^(n-1)表示-1的n-1次方)
10.矩阵快速幂
https://ac.nowcoder.com/acm/problem/blogs/200184斐波拉切
11.组合数的快速求法
https://www.cnblogs.com/Mychael/p/8282883.html
12.海伦公式求不规则四边形的面积
13.将二进制数最低位取反,最高位取反
lowbit()函数,得到最低位一的值
int lowbit(int x)
{
return x&(-x);
}
或者
#define lowbit(x) (x & -x)
14.break语句的前面不能并列用吗,为什么
15.组合数与杨辉三角
2^n=c(n,0)+c(n,1)+(n,2)+…+c[n,(n-1)]+c(n,n)

故二项式各项系数之和是2^n。
16.快速幂(我居然还没补上 )
ll qpow(ll a ,ll n)
{
if (n == 0) return 1;
else if (n == 1) return a;
if(n%2==1)return qpow(a,n-1)%moda;
else {//奇偶还可以改进
ll tmp=qpow(a,n/2)%mod;
return tmp
tmp;
}
}
上面那个不知道为什么,有几个测试点过不了
用这个
long long fpow(long long a, long long b) {
long long ans = 1;
for(; b; b >>= 1) {
if(b & 1) ans = ans * a % mod;
a = a * a % mod;
}
return ans;
}
17.AC自动机
18.向上取整
19.并查集
20.在这里插入图片描述

Supongo que te gusta

Origin blog.csdn.net/qq_51976555/article/details/117674772
Recomendado
Clasificación