求约数之和
给定n个正整数aiai,请你输出这些数的乘积的约数之和,答案对109+7取模。
输入格式
第一行包含整数n。
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。接下来n行,每行包含一个整数ai。
输出格式
输出一个整数,表示所给正整数的乘积的约数之和,答案需对109+7取模。
数据范围
1≤n≤100
1≤ai≤2∗10^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); } }

更多精彩