In a strange planet there are n races. They are completely different as well as their food habits. Each race has a food-eating period. That means the ith race eats after every xi de-sec (de-sec is the unit they use for counting time and it is used for both singular and plural). And at that particular de-sec they pass the whole day eating.
The planet declared the de-sec as 'Eid' in which all the races eat together.
Now given the eating period for every race you have to find the number of de-sec between two consecutive Eids.
Input
Input starts with an integer T (≤ 225), denoting the number of test cases.
Each case of input will contain an integer n (2 ≤ n ≤ 1000) in a single line. The next line will contain n integers separated by spaces. The ith integer of this line will denote the eating period for the ith race. These integers will be between 1 and 10000.
OutputFor each case of input you should print a line containing the case number and the number of de-sec between two consecutive Eids. Check the sample input and output for more details. The result can be big. So, use big integer calculations.
Sample Input2
3
2 20 10
4
5 6 30 60
Sample OutputCase 1: 20
Case 2: 60
#include <cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef unsigned long long ll;
const int maxn=1010;
int val[maxn];
int pri[maxn*10],num[maxn*10];
int cnt=0;
int ans[maxn*10];
/*
超时不一定是我们的结果正确,只是我们的计算已经超过了时间,自然就是错的
本来挺好的一道题,自己做的稀烂,忘记初始化num,结果一直T,不断的优化,还是没找出来,
最近真的很傻逼
*/
void init(){
for(int i=2;i<=10000;i++){
int m=(int)sqrt(i),flag=0;
for(int j=2;j<=m;j++)
if(i%j==0){
flag=1;break;
}
if(!flag) pri[cnt++]=i;
}
}
int bit[100],tmp[maxn*10];
void mul(int su,int cnt,int& len){
memset(tmp,0,(cnt+len)*sizeof(int));
for(int i=0;i<len;i++){
for(int j=0;j<cnt;j++){
tmp[i+j]+=ans[i]*bit[j];
}
}
int car=0;len=len+cnt;
for(int i=0;i<len;i++){
ans[i]=(tmp[i]+car)%10;
car=(tmp[i]+car)/10;
}
while(len>1&&ans[len-1]==0)len--;
}
void get_cntt(int& cnt,int base,int n){
int ans=1;
for(int i=1;i<=n;i++)ans*=base;
cnt=0;
while(ans){
bit[cnt++]=ans%10;
ans/=10;
}
}
int main()
{
init();
int T,kase=1;
scanf("%d",&T);
while(T--){
int len=1;
memset(ans,0,sizeof(ans));
memset(num,0,sizeof(num));
ans[0]=1;
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&val[i]);
int max_=1;
for(int i=1;i<=n;i++){
for(int j=0;j<cnt;j++){
max_=max(max_,j);
int tmp=0;
while(val[i]%pri[j]==0){
tmp++;
val[i]/=pri[j];
}
if(tmp>num[j])num[j]=tmp;
if(val[i]==1) break;//最后是1,不是0,傻逼了
}
}
printf("Case %d: ",kase++);
for(int i=0;i<=max_;i++){
if(!num[i])continue;
int cntt;
get_cntt(cntt,pri[i],num[i]);
mul(pri[i],cntt,len);
}
for(int i=len-1;i>=0;i--) printf("%d",ans[i]);
printf("\n");
}
return 0;
}