算法总结——基础数论1

· · 算法·理论

基础数论其实就是基础数学。用它的出的题是真的恶心

公式:

两点之间距离公式(勾股定理):

\sqrt{(x1-x2)^2+(y1-y2)^2}

其实不一定只有两个维度,三维,四维只要把公式改一点点就行了。比如三维:

\sqrt{(x1-x2)^2+(y1-y2)^2+(z1-z2)^2}

三角形面积公式(海伦公式):

s=\frac{1}{2} (a+b+c) \sqrt{s(s-a)(s-b)(s-c)}

幂的基本性质:

\begin{cases} &(ab)^c=a^cb^c\\ &(a^b)^c=a^{bc}=(a^c)^b\\ &a^ba^c=a^{b+c}\\ &\frac{a^b}{a^c}=a^{b-c} \end{cases}

异或:

异或应该是位运算里面最常用的吧,它可以理解为2进制中不进位的加法。

异或的基本性质:

\begin{cases} &a\oplus 0=a\\ &a\oplus a=0\\ &a\oplus b \oplus c = a \oplus (b \oplus c)\\ &a\oplus b = b \oplus a\\ &a\oplus a \oplus a = 0\oplus a=a \end{cases}

唯一分解定理:

一个大于等于1的正整数必定可以唯一拆分为若干个质因子相乘。

如果b\mid a(a能被b整除),那么:

int n,ans = 0;

int main(void) { scanf("%d",&n); for(int i = 1;i <= n;i++) { int x; scanf("%d",&x); ans ^= x; } cout << ans; return 0; }

## 例题2 [B3715 分解质因子 2](https://www.luogu.com.cn/problem/B3715)
#### 这题可以从小到大枚举质因子,发现一个合法的就输出并将$n$除以这个质因子,防止重复输出。通过唯一基本定理可知我们只需要枚举到$\sqrt{n}$如果最后$n$大于$1$这是它就是那个大于等于$\sqrt{n}$的质因子,输出即可。
### 代码:
```cpp
#include <bits/stdc++.h>
using namespace std;

int T;

int main(void)
{
    cin >> T;
    while(T--)
    {
        long long n;
        cin >> n;
        for(long long i = 2;i*i <= n;i++)
        {
            while(n % i == 0)
            {
                n /= i;
                cout << i << ' ';
            }
        }
        if(n > 1) cout << n;
        cout << '\n';
    }
    return 0;
}

数学还是非常重要的。