约数之和

#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;
	
	//(p1^0+p1^1+p1^2+....+p1^a1)(p2^0+p2^1+p2^3+...p2^a2)....(pn^0+...pn^an)

	//约数之和 
	for(map<int,int>::iterator it = Prime.begin(); it != Prime.end(); it++)
	{
		pair<int,int> a = *it;
		
		LL t = 1;
		while(a.second--)
		{
			t = (t * a.first + 1) % Mod
		}
		
		Result = Result * t % Mod;
	}
	
	cout<<Result<<endl;
	 
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值