【题意】
给定n个数,求这n个数的最小公倍数。
【题解】
最小公倍数当然不能按常规方法来求,因为最大的数将近是10000^1000级别的。然鹅最小公倍数怎么搞呢?
这里发现了一个规律:
4
5 6 30 60
5 : 5 //说明最小公倍数的因子中一定有一个5
6 : 2*3 //说明最小公倍数的因子中一定有一个2和一个3;
30 : 2*3*5 //说明最小公倍数的因子中一定有一个2和一个3和一个5;
60 : 2^2*3*5 //说明最小公倍数的因子中一定有2个2和一个3和一个5;
所以我们可以忽略那些个数比较少的, 找到说明结果中一定含有 2个2 1个3 1个5;
最后要用到高精度乘法。
#include <bits/stdc++.h> using namespace std; typedef long long LL; int a[10003], b[5000]; void Mul(int b[], LL n) { int i; for(i = 1; i <= b[0]; i++) b[i] *= n; for(i = 1; i <= b[0]; i++) b[i+1] += b[i] / 10, b[i] %= 10; while(b[i]) b[i+1] += b[i] / 10, b[i] %= 10, i++, b[0]++; } LL q_pow(int x, int y) { LL ans = 1; while(y) { if(y&1) ans *= x; x *= x; y >>= 1; } return ans; } int main() { int t, n, i, cas = 0, m; cin>>t; while(t--) { scanf("%d", &n); memset(a, 0, sizeof(a)); int max1 = 0; while(n--) { scanf("%d", &m); max1 = max(max1, m); for(i = 2; i <= m; i++) { int tep = 0; while(m % i == 0) tep++, m /= i; a[i] = max(a[i], tep); } } memset(b, 0, sizeof b); b[1] = 1, b[0] = 1; for(i = 2; i <= max1; i++) { if(a[i] != 0) Mul(b, q_pow(i, a[i])); } printf("Case %d: ", ++cas); for(i = b[0]; i >= 1; i--) printf("%d", b[i]); cout<<endl; } return 0; }