试除法 求约数
#include<bits/stdc++.h>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
#define ll long long long
#define forr(i,a,b) for(int i=a;i<=b;i++)
vector<int> pri(int n){
vector<int> res;
forr(i,1,n/i){
if(n%i==0){
res.push_back(i);
if(i!=n/i)
res.push_back(n/i);
}
}
sort(res.begin(),res.end());
return res;
}
int main(){
int t;
cin>>t;
while(t--){
int n;
cin>>n;
auto res=pri(n);
for(auto t:res){
cout<<t<<" ";
}
cout<<endl;
}
return 0;
}
约数个数
#include<bits/stdc++.h>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
#define ll long long
#define forr(i,a,b) for(int i=a;i<=b;i++)
unordered_map<int,int> pri;
const int mod=1e9+7;
int main(){
int t;
cin>>t;
while(t--){
int n;
cin>>n;
forr(i,2,n/i){
while(n%i==0){
n/=i;
pri[i]++;
}
}
if(n>1)pri[n]++;
}
ll res=1;
for(auto p:pri){
res=res*(p.second+1)%mod;
}
cout<<res<<endl;
return 0;
}
约数之和
#include<bits/stdc++.h>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
#define ll long long
#define forr(i,a,b) for(int i=a;i<=b;i++)
unordered_map<int,int> pri;
const int mod=1e9+7;
int main(){
int t;
cin>>t;
while(t--){
int n;
cin>>n;
forr(i,2,n/i){
while(n%i==0){
n/=i;
pri[i]++;
}
}
if(n>1)pri[n]++;
}
ll res=1;
for(auto p:pri){
ll a=p.first,b=p.second;
ll tem=1;
while(b--) tem=(tem*a+1)%mod;
res=res*tem%mod;
}
cout<<res<<endl;
return 0;
}