约数个数

求一个数的约数的个数

把一个数分解完质因数
N = (a1 ^ p1) * (a2 ^p2) * (a3 ^ p3) * ……*(an ^ pn)的形式
那么从a1 ^ 0 到 a1 ^ p1都是N的约数
同理从a2 ^ 0 到 a2 ^ p2都是N的约数

所以约数个数(p1+1)x(p2+1)x(p3+1)x…(pn+n)

题目

给定n个正整数ai,请你输出这些数的乘积的约数个数,答案对109+7

取模。
输入格式

第一行包含整数n。

接下来n行,每行包含一个整数ai


输出格式

输出一个整数,表示所给正整数的乘积的约数个数,答案需对109+7

取模。
数据范围

1≤n≤100
,
1≤ai≤2∗109

输入样例:

3
2
6
8

输出样例:

12

#include <iostream>
#include <map>
using namespace std;

typedef long long LL;
int n;//输入n个数 求n个数的乘积后的约数个数
const int Mod = 1e9+7;//数太大需要取余 

int main(int argc, char** argv) 
{
	scanf("%d",&n);
	//<素数,次幂>
	map<int , int> Prime;
	
	while(n--)
	{
		int nNum;
		scanf("%d",&nNum);
		
		//分解成质因子乘积的形式 
		for(int i = 2; i <= nNum/i; i++)
		{
			while(0 == nNum%i)//i必定是质数 
			{
			 	nNum /= i; 
				Prime[i]++;//记录次幂	
			}	
		}
		
		if(nNum > 1) Prime[nNum]++;
			
	} 
	
	LL Result = 1;
	
	//约数个数 
	for(map<int,int>::iterator it = Prime.begin(); it != Prime.end(); it++)
	{
		pair<int,int> a = *it;
		Result = Result*(a.second+1) % Mod;
	}
	
	cout<<Result<<endl;
	
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值