给定n个正整数aiai,请你输出这些数的乘积的约数之和,答案对109+7取模。

输入格式

第一行包含整数n。

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

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

输出格式

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

数据范围

1n100
1ai210^9

输入样例:

3
2
6
8

输出样例:

252

约数和公式

对于已经分解的整数A=(p1^k1)*(p2^k2)*(p3^k3)*....*(pn^kn)

有A的所有因子之和为

           S = (1+p1+p1^2+p1^3+...p1^k1) * (1+p2+p2^2+p2^3+….p2^k2) * (1+p3+ p3^3+…+ p3^k3) * .... * (1+pn+pn^2+pn^3+...pn^kn)
   

    代码:

import java.util.*;
public class Main{
        static final int mod=(int)1e9+7;
        static Map<Integer, Integer> map=new HashMap<Integer, Integer>();
        static int t;
        static long quick_pow(long a,long b){
                long res=1;
                while(b>0){
                        if((b&1)==1) res=res*a%mod;
                        a=a*a%mod;
                        b>>=1;
                }
                return res%mod;
        }
        public static void main(String[] args) {
                Scanner scan=new Scanner(System.in);
                t=scan.nextInt();
                
                //求解每个质因子的指数
                while(t-->0){    
                        int n=scan.nextInt();
                        for(int i=2;i<=n/i;i++){
                                if(n%i==0){
                                        while(n%i==0){
                                                n/=i;
                                                if(map.get(i)==null) map.put(i, 1);
                                                else map.put(i, map.get(i)+1);
                                        }
                                }
                        }
                        if(n>1) {
                               if(map.get(n)==null) map.put(n, 1);
                               else map.put(n, map.get(n)+1);
                        }
                }
                
                //求约数和
                long res=1;
                Set<Integer> key=map.keySet();
                Iterator<Integer> it=key.iterator();
                while(it.hasNext()){
                    int p=it.next();
                    int  k=map.get(p);
                    long s=0;
                    for(int i=0;i<=k;i++){
                        s+=quick_pow(p,i);
                        s%=mod;
                    }
                    res=res*s%mod;
                }
                System.out.println(res);
                        
        }
}

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄