试除法求约数
#include<bits/stdc++.h>
using namespace std;
int n;
void get_divisors(int n)
{
vector<int> v;
for( int i = 1; i <= n/i; i++ ){
if(n%i==0){
v.push_back(i);
// 避免i==n/i 重复放入
if(i!=n/i)
v.push_back(n/i);
}
}
sort(v.begin(), v.end());
for(auto t: v)
cout<<t<<' ';
}
int main()
{
cin>>n;
while(n--){
int a;
cin>>a;
get_divisors(a);
puts("");
}
return 0;
}
约数个数 约数之和
如果 N = p1^c1 * p2^c2 * ... *pk^ck
约数个数: (c1 + 1) * (c2 + 1) * ... * (ck + 1)
约数之和: (p1^0 + p1^1 + ... + p1^c1) * ... * (pk^0 + pk^1 + ... + pk^ck)
约数个数
#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef long long LL;
const int mod = 1e9+7;
int n;
int main()
{
cin>>n;
unordered_map<int, int> m;
while(n--){
int a;
cin>>a;
for( int i = 2; i <= a/i; i++ )
while(a%i==0){
m[i]++;
a/=i;
}
// a的最大公约数可能大于sqrt(a);
if(a > 1)
m[a]++;
}
LL res = 1;
for(auto t: m){
res = res*(t.y+1)%mod;
}
cout<<res<<endl;
return 0;
}
约数之和
#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef long long LL;
const int Mod = 1e9+7;
int n;
int main()
{
cin>>n;
unordered_map<int, int> m;
while(n--){
int a;
cin>>a;
for( int i = 2; i <= a/i; i++ )
while(a%i==0){
m[i]++;
a/=i;
}
if(a > 1)
m[a]++;
}
LL ans = 1;
for(auto t: m){
LL a = t.x, b = t.y;
LL k = 1;
while(b--)
k = (k*a + 1)%Mod;
ans = ans*k%Mod;
}
cout<<ans<<endl;
return 0;
}
求最大公约数
辗转相除法
return b?gcd(b, a%b):a
#include<bits/stdc++.h>
using namespace std;
int n;
int gcd(int a, int b)
{
return b?gcd(b, a%b):a;
}
int main()
{
cin>>n;
while(n--){
int a, b;
cin>>a>>b;
cout<<gcd(a, b)<<endl;
}
return 0;
}
本文来自博客园,作者:对影丶成三人,转载请注明原文链接:https://www.cnblogs.com/IntroductionToAlgorithms/p/15399165.html
浙公网安备 33010602011771号