1. 程式人生 > >【lightoj-1024】Eid (高精度)

【lightoj-1024】Eid (高精度)

bit 個數 += bits 我們 i++ long span 不能

【題意】

給定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; }

【lightoj-1024】Eid (高精度)