这个题目的关键就是求一个数因数的个数。令一个数为N,任何一个数(除1外)都可以转化为质数的乘积。则,其中p1,p2.......pn都是不重复的素数,那么由于乘法定理可以知道F(N)=(a1+1)*(a2+1)*...*(an+1),其中F(N)求的是一个数N因数的个数。
可以举一个很容易理解的例子,6的因素有多少个呢?易知是4个,其中6=2*3,那么在构造6的因数的时候就是用2或3来构造的,由于只有1个2,那么对2的选择有两种情况,即选或不选,同理对3的选择也只有2种选法,因此由乘法定理得2*2=4,因此6有4个因数。
还可以结合这个博客来理解,分解质因数 - 知乎。
然后,由于题目中n的数量是比较多的,如果将n个数先乘起来,再计算质因数的个数以及每个质因数的指数是不合理的,因为当n很大以及每个a也很大的时候,__int64是无法表达下的。因此我们可以开一个数组来记录质因数的指数。
第一种做法:比较朴素的做法
#include <stdio.h>
#include <math.h>
#include <string.h>
#define ll __int64
#define NUM 100005
#define MOD 1000000007
int p[NUM];//记录数组,记录每一个质因数的指数
int main(){
int t;
scanf("%d",&t);
while(t--){
int n;
scanf("%d",&n);
memset(p,0,sizeof p); //开始要初始化
while(n--){
int x;
scanf("%d",&x);
for(int i=2;i<=sqrt(x);i++){ //求质因数
while(x%i==0){
p[i]++;
x/=i;
}
}
if(x!=1){
p[x]++;
}
}
ll ans=1;
for(int i=0;i<NUM;i++){
if(p[i]) ans=ans*(p[i]+1)%MOD;
}
printf("%I64d\n",ans);
}
return 0;
}
通过观察,题目有一个信息是很关键的,那就是再给Quincy n个数字a(1<=a<=100000),保证a只有3个或者5个因子,如果注意到3个或5个因子这个信息,我们就可以结合上述因数个数定理得到这个数一定是某一个素数的平方或者是某一个素数的四次方,那么就可以不用暴力来求一个数的质因数了,就可以直接求这个数的质因数。因此以后做题目可以思考为什么要限制是3或5个因子,可以想一下出题人的用意哦!
那么第二种优化的做法,大家就自己实现了喽。