算法之数学知识
威尔逊定理:
如果p是指数,那么(p-1)!对于p取模恒等于p-1.
逆元
逆元可以用来干什么呢,比如说对于 (a/b) mod p,并没有 ((a mod p) / (b mod p)) mod p,但是直接除又会爆精度,这时我们就可以用到逆元,假设用 inv(b) 代表 b 的逆元,
那么 (a / b) mod p = (a * inv(b)) mod p。
两个相邻的数一定互质
完全平方数的性质:
https://codeforces.com/contest/2020/problem/B
只有完全平方数的因子数量是奇数。因此,开启的灯泡数量等于小于或等于n nn的完全平方数的数量。
设 m 为小于或等于 n 的最大完全平方数的平方根,则开启的灯泡数量为 m。
排列
计算冒泡排序swap次数,排列反转后的次数等于n~1的次数-反转前的排列次数。
归并排序可以求解逆序对数量
时间复杂度O(nlogn)
字符串哈希如何快速比较两个字符串大小
因为有哈希值这个东西,考虑最长公共前缀 LCP
我们去二分 LCP 的长度,每次比较哈希值,
然后找到第一个不同的位置,
直接比较大小即可
*max_element, *min_element:
点击查看代码
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
    std::vector<int> a = {3, 1, 4, 1, 5, 9, 2, 6};
    int max1 = *max_element(a.begin(), a.end());
    int min1 = *min_element(a.begin(), a.end());
    std::cout << "Max: " << max1 << std::endl;
    std::cout << "Min: " << min1 << std::endl;
    return 0;
}
自定义比较函数:
点击查看代码
bool abs_compare(int a, int b) {
    return abs(a) < abs(b);
}
int main() {
    std::vector<int> a = {-3, 1, -4, 1, -5, 9, 2, -6};
    int max_abs = *max_element(a.begin(), a.end(), abs_compare);
    std::cout << "Max absolute value: " << max_abs << std::endl;
}

                
            
        
浙公网安备 33010602011771号