约数个数和约数之和
约数个数和约数之和推导:
约数个数代码实现:
求n个数的乘积的约数个数:
#include<iostream>
#include<unordered_map>
using namespace std;
#define int long long
const int p=1e9+7;
unordered_map<int,int>mp;
void divide(int x){
for(int i=2;i<=x/i;i++){
while(x%i==0){
x/=i;
mp[i]++;
}
}
if(x>1)mp[x]++;
}
signed main(){
int t;
cin>>t;
int res=1;
while(t--){
int x;
cin>>x;
divide(x);
}
for(auto t:mp)res=res*(t.second+1)%p;
cout<<res<<endl;
return 0;
}
约数之和代码实现:
求n个数相乘的约数之和:
#include<iostream>
#include<unordered_map>
using namespace std;
#define int long long
const int p=1e9+7;
unordered_map<int,int>mp;
void divide(int x){
for(int i=2;i<=x/i;i++){
while(x%i==0){
x/=i;
mp[i]++;
}
}
if(x>1)mp[x]++;
}
signed main(){
int t;
cin>>t;
int res=1;
while(t--){
int x;
cin>>x;
divide(x);
}
for(auto t:mp){
int k=t.second;
int temp=1;
while(k--)temp=(temp*t.first+1)%p;
res=res*temp%p;
}
cout<<res<<endl;
return 0;
}
N!分解质因数和(N!)^2的约数个数推导
将N!分解质因数代码实现:
#include<iostream>
using namespace std;
const int N=1e6+5;
int prime[N],vis[N],cnt;
void init(int n){
for(int i=2;i<=n;i++){
if(!vis[i])prime[cnt++]=i;
for(int j=0;prime[j]*i<=n;j++){
vis[prime[j]*i]=1;
if(i%prime[j]==0)break;
}
}
}
int main(){
int n;
cin>>n;
init(n);
for(int i=0;i<cnt;i++){
int count=0;
for(int j=n;j;j/=prime[i])count+=j/prime[i];
cout<<prime[i]<<" "<<count<<endl;
}
return 0;
}
求解(N!)^2的约数个数代码实现:
#include<iostream>
using namespace std;
const int N=1e6+5,p=1e9+7;
int prime[N],vis[N],cnt;
void init(int n){
for(int i=2;i<=n;i++){
if(!vis[i])prime[cnt++]=i;
for(int j=0;prime[j]*i<=n;j++){
vis[prime[j]*i]=1;
if(i%prime[j]==0)break;
}
}
}
int main(){
int n;
cin>>n;
init(n);
int res=1;
for(int i=0;i<cnt;i++){
int count=0;
for(int j=n;j;j/=prime[i])count+=j/prime[i];
res=res*(count*2+1)%p;
}
cout<<res<<endl;
return 0;
}