求区间交集intersect
max(min(r1, r2) - max(l1, l2) + 1ll, 0ll)//1e9数据范围大, 交集为负数->0
删除重复元素
vector<int> l(2), r(2), v;
v.push_back(i);
v.erase(unique(v.begin(), v.end()), v.end());
//erase(开头, 结尾) unique将重复元素置于栈尾, 返回结尾第一个重复元素的指针
GCD (greatest common divisor) & LCM(least common multiple)
#include <algorithm>
using namespace std;
lcm(a, b) = a * b / gcd(a, b);
1.0stl自带函数(较慢)//a, b可以为0
inline int gcd(int a, int b) {
return __gcd(a, b);
}
1.1基础(常速)//a, b可以为0
inline int gcd(int a,int b)
{
int r;
while(b>0)
{
r=a%b;
a=b;
b=r;
}
return a;
}
1.3.三目运算符模拟(较快)//a, b可以为0
inline int gcd(int a,int b)
{
return b > 0 ? gcd(b, a % b) : a;
}
*****2.位运算+if+while(超快)//a, b 可以为0
inline int gcd(int a, int b){
if (b) while ((a %= b) && (b %= a));//&&逻辑与 > %=自反
return a + b;
}
3.自反运算/位运算(超快)//a, b非零
inline int gcd(int a,int b)
{
while (b ^= a ^= b ^= a %= b);//自反运算:从r至l
return a;
}
4.辗转相除法(较快)//a, b非零
inline int gcd(int a,int b)
{
if(a%b==0)
return b;
else return (gcd(b,a%b));
}
运算符优先级
位运算
1 | 2 | 3 | 4 | ||||||
<< | >> | & | ^ | | |
逻辑运算
1 | 2 | ||||||||
&& | || |
自反(从r至l)
%= | ^= |