做题感悟:开始就想到了解题思路,但是不知道怎样求约数的个数的公式。
解题思路:这题主要是知道求约数的公式: 一个数的约数就等于这个数所有的质约束的指数加 1 相乘的结果。例如:12 = 2*2*3 所以 12 的约数的个数为 (2+1)*(1+1)=6 ,同时也可以知道所有约数的和,例如 12 所有约数的和为:(2^0 + 2^1)*( 3^0 +3^1 ) 把这个式子分解开就是所有约数。
代码:
#include<stdio.h>
#include<iostream>
#include<map>
#include<string>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std ;
#define pret(a,b) memset(a,b,sizeof(a))
const int INF = 99999999 ;
const double esp = 0.000000001 ;
const int MX= 10005 ;
int b[MX] ;
bool is_prime[MX] ;
int prime[MX],num ;
void init()
{
num=0 ;
memset(is_prime,false,sizeof(is_prime)) ;
for(int i=2 ;i<MX ;i++)
{
if(!is_prime[i])
prime[num++]=i ;
for(int j=0 ;j<num&&i*prime[j]<MX ;j++)
{
is_prime[i*prime[j]]=true ;
if(i%prime[j]==0)
break ;
}
}
}
int main()
{
init() ;
int T,x ;
scanf("%d",&T) ;
while(T--)
{
memset(b,0,sizeof(b)) ;
for(int i=0 ;i<10 ;i++)
{
scanf("%d",&x) ;
for(int j=0 ;j<num ;j++)
if(x%prime[j]==0)
{
while(x%prime[j]==0)
{
x/=prime[j] ;
b[j]++ ;
}
}
}
int ans=1 ;
for(int i=0 ;i<num ;i++)
if(b[i])
ans=(ans*(b[i]+1))%10 ;
printf("%d\n",ans) ;
}
return 0 ;
}