根据算数基本定理,一个数可以由若干个质因子的乘积组成。公式如下:
求约数个数的公式:
我们可以发现求约数个数的公式是其所有约数的指数+1相乘得到的。
验证:
以12举例,
12的约数有1, 2, 3, 4, 6, 12
约数个数:,相当于求每个约数的组合个数,前面有三种可能,, , ,后面有两种可能, 。将前面三种可能和后面两种可能进行排列组合,总共有2 * 3种可能。
证明
无
求约数之和的公式:
约数之和: 相当于对约数个数的每种可能取出,进行相加,得到所有约数的和。
验证:
解:将360分解质因数可得
由约数和定理可知,360所有正约数的和为
证明
无
code
#include<bits/stdc++.h>
using namespace std;
const int MOD=1e9+7;
unordered_map<int,int>h;
long long res;
int solve(int n)
{
for(int i=2;i*i<=n;i++)
{
while(n%i==0) //i能整除n,说明i是n的约数
{
h[i]++; //统计一下约数的个数,即指数个数
n/=i; //把i除尽
}
}
if(n>1)h[n]++; //最后一个约数
res=1;
for(auto it=h.begin();it!=h.end();it++)
{
//套用求约数个数的公式
res=res*(it->second+1)%MOD;
}
return res;
}
int main()
{
int n;cin>>n;
while(n--)
{
int x;cin>>x;
solve(x);
}
cout<<res<<endl;
return 0;
}