数学相关

数学相关

最大公约数

  • 模板
int gcd(int a, int b)
{
	int x = a % b;
    while(x)
    {
        a = x;
        a ^= b ^= a ^= b;
        x = a % b;
    }
    return b;
}

最小公倍数

  • 模板
int lcm(int a, int b){
    return a*b / gcd(a, b);
}

质数相关

确定是不是质数/素数

  • 模板
bool is_prime(int n)
{
    if(i < 2) return false;
    for(int i = 2; i <= n / i; i ++ )
    {
        if(n % i == 0) reutrn false;  // 判断是不是素数
    }
    return ture;
}

分解质因数

  • 分析

这里有个性质:n中最多只含有一个大于sqrt(n)的因子。证明通过反证法:如果有两个大于sqrt(n)的因子,那么相乘会大于n,矛盾。证毕
于是我们发现最多只有一个大于sqrt(n)的因子,对其进行优化。先考虑比sqrt(n)小的,代码和质数的判定类似
最后如果n还是>1,说明这就是大于sqrt(n)的唯一质因子,输出即可。

  • 模板
#include <bits/stdc++.h>

using namespace std;

int n, x;

int main()
{
    cin >> n;
    while(n -- )
    {
        cin >> x;
        for(int i = 2; i <= x / i; i ++ )  // 从2开始递增遍历判断
        {
            if(x % i == 0)  // 若是因子
            {
                int s = 0;
                while(x % i == 0)  // 循环判断,将如 8 = 2^3 这种情况搞出来
                {
                    s ++;
                    x /= i;
                }
                cout << i << ' ' << s << endl;
            }
        }
        if(x != 1) cout << x << ' ' << '1' << endl;  // 这是一个性质,若最后x不为1,则x一定是一个质因子
        cout << endl;
    }
    return 0;
}

质数筛

  • 线性筛法(欧拉筛)O(n)

  • 诶氏筛法 O(nloglogn)

posted @ 2024-05-08 13:26  ihuahua1415  阅读(284)  评论(0)    收藏  举报
*/