算术基本定理:任何一个大于1的自然数N,如果N不为质数,那么N可以唯一分解成有限个质数的乘积.
则:
,其中 p 为素数(质数)。
约数的个数:
约数的和 :
欧几里得算法(辗转相除法)
//最大公约数
int gcd(int a, int b)
{
return b ? gcd(b,a%b):a;
}
//约数个数
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1e9+7;
int main()
{
int n;
cin>>n;
unordered_map<int,int> primes;
while(n--)
{
int x;
cin>>x;
for(int i=2;i<=x/i;i++)
while(x%i==0)
{
x/=i;
primes[i]++;
}
if(x>1) primes[x]++;
}
ll res=1;
for(auto prime:primes) res=res*(prime.second+1)%mod;
cout<<res;
return 0;
}
//约数之和
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1e9+7;
int main()
{
int n;
cin>>n;
unordered_map<int,int> primes;
while(n--)
{
int x;cin>>x;
for(int i=2;i<=x/i;i++)
while(x%i==0)
{
x/=i;
primes[i]++;
}
if(x>1) primes[x]++;
}
ll res=1;
for(auto prime:primes)
{
int p=prime.first,a=prime.second;//p为底数,a为指数
ll t=1;
while(a--) t=(t*p+1)%mod;
res=res*t%mod;
}
cout<<res;
return 0;
}