试除法是一个很好的办法。这个算法的大致意思是让小于 n 的数都和 n 相除,如果余数为零可以判断为合数。
有了大致思路还不行,还可以优化。合数都是成对出现的,对吧。我们用 n 除以 i,余数为零,那么商也是另一个约数。
#include<iostream>#include<algorithm>#include<vector>usingnamespacestd;intmain(){int n; cin >> n;while(n --){int m; cin >> m; vector<int> p;for(int i =1; i <= m / i; i ++){if(m % i ==0){p.push_back(i);if(m / i != i)p.push_back(m / i);}}sort(p.begin(),p.end());for(int i =0; i <p.size(); i ++) cout <<p[i]<<''; cout << endl;}}
#include<iostream>
#include<algorithm>
#include<unordered_map>
using namespace std;
const int N = 1e9 + 7;
int main(){
int n; cin >> n;
long long res = 1;
unordered_map<int, int> hs;
while (n -- ){
int m; cin >> m;
for (int i = 2; i <= m / i; i ++){ //枚举到 i*i <= m
if (m % i == 0){
while (m % i == 0){
hs[i] ++;
m /= i;
}
}
}
if (m > 1) hs[m]++; // 只存在一个大于根号m的数是m的分解质数
}
for (auto prime : hs) res = res * (prime.second + 1) % N;
cout << res;
}
#include<iostream>
#include<algorithm>
#include<unordered_map>
using namespace std;
const int N = 1e9 + 7;
long long horner(int p, int x){
long long res = 1;
for (int i = 0 ; i < x; i ++){
res = (res * p + 1) % N;
}
return res;
}
int main(){
int n ; cin >> n;
unordered_map<int, int> primes;
while (n -- ){
int m ; cin >> m;
for (int i = 2; i <= m / i; i ++){
if (m % i == 0){
while (m % i == 0){
primes[i] ++;
m /= i;
}
}
}
if (m > 1) primes[m] ++;
}
long long res = 1;
for (auto prime : primes){
res = res * horner(prime.first, prime.second) % N;
}
cout << res;
}
#include<iostream>
#include<algorithm>
using namespace std;
int gcd(int a ,int b){
return a == 0 ? b : gcd( b % a, a);
}
int main(){
int n; cin >> n;
while (n -- ){
int a, b; cin >> a >> b;
cout << gcd(a, b) << endl;
}
}