http://lightoj.com/volume_showproblem.php?problem=1024
将每个数全部拆分,并且统计因子单个数中出现次数最高的,最后每个数字出现的次数相乘 大数相乘直接输出
详细解答:http://www.cnblogs.com/zhengguiping--9876/p/5997481.html
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<queue> #include<map> #include<vector> #include<math.h> #include<string> using namespace std; #define INF 0x3f3f3f3f #define LL long long #define N 10006 #define Lson rood<<1 #define Rson rood<<1|1 int q[N],w[N],a[N],sum[N],k=0; void prime() { int w[N]; for(int i=2;i<200;i++) { if(!w[i]) { q[k++]=i; for(int j=i+i;j<200;j+=i) w[j]=1; } } } void add(int x) { for(int i=0;i<1000;i++) a[i]=a[i]*x; for(int i=0;i<1000;i++) { a[i+1]+=a[i]/10000; a[i]=a[i]%10000; } } void Q() { int i=999; while(a[i]==0&&i>0) i--; printf("%d",a[i--]); while(i>=0) printf("%04d",a[i--]); printf(" "); } int main() { prime(); int T,n,t=1,d; scanf("%d",&T); while(T--) { memset(a,0,sizeof(a)); memset(sum,0,sizeof(sum)); scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d",&d); for(int j=0;j<k&&q[j]*q[j]<=d;j++) { int ans=0; while(d%q[j]==0) { ans++; d=d/q[j]; } sum[q[j]]=max(sum[q[j]],ans); } if(d>1) sum[d]=max(sum[d],1); } a[0]=1; for(int i=2;i<N;i++) { if(!sum[i]) continue; int x=1; for(int j=0;j<sum[i];j++) x=x*i; add(x); } printf("Case %d: ",t++); Q(); } return 0; }