(约数)试除法求约数\约数个数\约数之和板子
1.试除法求约数
#include <bits/stdc++.h>
using namespace std;
int n, a;
vector<int> res;
signed main(){
scanf("%d", &n);
while(n--){
res.clear();
scanf("%d", &a);
for(int i = 1; i <= a / i; ++i){
if(a % i == 0){
if(i != a / i) {res.push_back(i);res.push_back(a/i);}
else res.push_back(i);
}
}
sort(res.begin(), res.end());
for(auto it : res) printf("%d ", it);
puts("");
}
return 0;
}
2. 约数个数
一个数的约数是由这个数的几个质因子相乘得到的。
#include <bits/stdc++.h>
using namespace std;
const long long mod = 1e9 + 7;
int n, a;
unordered_map<int, int> mp;
signed main(){
scanf("%d", &n);
while(n--){
scanf("%d", &a);
for(int i = 2; i <= a / i; ++i){
if(a % i == 0){
while(a % i == 0){
a /= i;
++mp[i];
}
}
}
if(a > 1) ++mp[a];
}
long long res = 1;
for(auto it: mp){
res = res * (it.second + 1) % mod;
}
printf("%lld\n", res);
return 0;
}
3.约数之和
#include <bits/stdc++.h>
using namespace std;
const long long mod = 1e9 + 7;
int n, a;
unordered_map<int, int> mp;
signed main(){
scanf("%d", &n);
while(n--){
scanf("%d", &a);
for(int i = 2; i <= a / i; ++i){
if(a % i == 0){
while(a % i == 0){
++mp[i];
a /= i;
}
}
}
if(a > 1) ++mp[a];
}
long long res = 1;
for(auto item : mp){
long long tmp = 1;
while(item.second--) tmp = ((tmp * item.first) + 1) % mod;
res = res * tmp % mod;
}
printf("%lld\n", res);
return 0;
}

浙公网安备 33010602011771号