约数和公约数
一个数的所有约数
试除法
枚举到sqrt(n) ,原理同判断质数。
vector<int> div(int k){
vector<int>ans;
for(int j=1;j<=k/j;j++){
if(k%j==0){
ans.push_back(j);
if(j!=k/j)
ans.push_back(k/j);
}
}
sort(ans.begin(),ans.end());//k的约数约有log个
return ans;
}
#include<bits/stdc++.h>
using namespace std;
const int mod=1e9 +7;
int main(){
int n;
cin>>n;
unordered_map<int,int>prime;//质因数和指数
while(n--){
int k;
cin>>k;
for(int j=2;j<=k/j;j++){//分解质因数得到底数和指数
while(k%j==0){
k/=j;
prime[j]++;
}
}
if(k>1)prime[k]++;
}
long long ans=1;
for(auto [p,cnt]:prime){
ans=(ans*(cnt+1))%mod;//约数个数等于分解式的所有指数+1的乘积
}
cout<<ans<<endl;
}
#include<bits/stdc++.h>
using namespace std;
const int mod=1e9 +7;
int main(){
int n;
cin>>n;
unordered_map<int,int>prime;//质因数和指数
while(n--){
int k;
cin>>k;
for(int j=2;j<=k/j;j++){//分解质因数得到底数和指数
while(k%j==0){
k/=j;
prime[j]++;
}
}
if(k>1)prime[k]++;
}
long long ans=1;
for(auto [p,cnt]:prime){
long long t=1;
while(cnt--)t=(p*t+1)%mod;//质因数所有指数的和
ans=(ans*t)%mod;//求积
}
cout<<ans<<endl;
}