You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

86 lines
2.0 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
//约数和定理
//https://baike.baidu.com/item/%E7%BA%A6%E6%95%B0%E5%92%8C%E5%AE%9A%E7%90%86/3808428
/**
例题正整数360的所有正约数的和是多少
将360分解质因数可得
360=2^3*3^2*5^1
由约数和定理可知360所有正约数的和为
(2^0+2^1+2^2+2^3)×(3^0+3^1+3^2)×(5^0+5^1)=(1+2+4+8)(1+3+9)(1+5)=15×13×6=1170
可知360的约数有1、2、3、4、5、6、8、9、10、12、15、18、20、24、30、36、40、45、60、72、90、120、180、360
则它们的和为1+2+3+4+5+6+8+9+10+12+15+18+20+24+30+36+40+45+60+72+90+120+180+360=1170
*/
const int N = 1010;
int a[N];
int cnt;
//下面是求所有约数的方法
void ben(int n) {
for (int i = 1; i <= sqrt(n); i++) {
if (n % i == 0) {
a[++cnt] = i;
if (n != i * i)
a[++cnt] = n / i;
}
}
}
/**
* 功能:快速幂
* @param m
* @param k
* @return
*/
int qmi(int m, int k) {
int res = 1, t = m;
while (k) {
if (k & 1) res = res * t;
t = t * t;
k >>= 1;
}
return res;
}
/**
* C++版本的约数和定理
* https://blog.csdn.net/qq_40924940/article/details/86525912
* @param n
* @return
*/
LL getSum(LL n) {
LL res = 1;
for (LL i = 2; i * i <= n; i++) {
LL k = 0;
while (n % i == 0) {
n = n / i;
k++;
}
res = res * ((1 - qmi(i, k + 1)) / (1 - i));
}
if (n != 1) res *= (1 + n);
return res;
}
int main() {
//1、算出所有约数再求和
ben(360);
//排序一下,否则顺序有点看不懂
sort(a + 1, a + 1 + cnt);
for (int i = 1; i <= cnt; i++)cout << a[i] << " ";
cout << endl;
//计算一下总和
long long sum = 0;
for (int i = 1; i <= cnt; i++)sum += a[i];
cout << sum << endl;
//2、根据公式算一下约数和
cout << getSum(360) << endl;
return 0;
}