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

2 years ago
#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
3601234568910121518202430364045607290120180360
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;
}