#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
#define MOD_NUM 9973
#define Max_n 5002
int prime[Max_n] = {0};
int func[Max_n] = {0};
void init_prime(){
for (int i = 2 ; i < Max_n; i++)
if (!prime[i])
for (int j = i; j < Max_n; j+=i)
if (!prime[j])
prime[j] = i;//最小的素数因子,巧妙
prime[1] = prime[0] = 0;
//for(int i=0;i<Max_n;i++)
// printf("%d ",prime[i]);
}
void init(){
for (int i = 0; i < Max_n; i++)
func[i] = 0;
}
int main(){
int n, temp, num;
init_prime();
while (~scanf("%d", &n)) {
init();
for (int i = 0; i < n; i++){
scanf("%d", &temp);
num = 0;
while (prime[temp])
{
num++;
if (prime[temp] == prime[temp / prime[temp]] )
temp /= prime[temp]; //继续除直到对该素因子的余数为0;
else
{
if(func[prime[temp]] < num) //这只是对num的判断,不论大小num都应该清零
func[prime[temp]] = num; //func数组记录素因子指数的最大值。
num = 0;
temp /= prime[temp]; //除新的素因子
}
}
}
//for (int j = 0; j < Max_n; j++)
//if(func[j])
// printf("%d %d \n ",j,func[j]);
__int64 ans = 1;
for (int i = 0 ; i < Max_n; i++){
for (int j = 0; j < func[i]; j++) //pow
ans = (ans * i)%MOD_NUM;
}
printf("%I64d\n", ans);
}
return 0;
}
连续数的最小公倍数(时间超短)
最新推荐文章于 2022-02-07 12:28:59 发布