1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55 |
/** * 求LCM(1,2,3,...n) **/ #include <iostream> #include <cstdio> #include <algorithm> using
namespace std; #define N 100000010 unsigned int
prime[6000000], p[6000000], T, num; unsigned int
flag[3126000]; void
slove( int
n) { unsigned int
res = 1; int
i, t1, t2; for (i = 0; i <= num && prime[i] * prime[i] <= n; ++i) { t1 = prime[i]; t2 = prime[i] * prime[i]; while (t2 / t1 == prime[i] && t2 <= n) { t1 *= prime[i]; t2 *= prime[i]; } res *= (t1 / prime[i]); } int
t = upper_bound(prime, prime+num, n) - prime - 1; res *= p[t]; printf ( "%u\n" , res); } //生成素数 void
initPrime() { int
i, j; p[num=0] = prime[0] = 2; for (i = 3; i < N; i += 2) { if ( !(flag[i/32]&(1<<(i%32))) ) { prime[++num] = i; p[num] = i * p[num-1]; for (j = i * 3; j < N; j += i * 2) flag[j/32] |= 1<<(j%32); } } } int
main() { initPrime(); prime[++num] = 100000003; scanf ( "%d" , &T);; int
i, n; for (i = 0; i < T; ++i) { scanf ( "%d" , &n); slove(n); } return
0; } |
原文:http://www.cnblogs.com/yaling/p/3572290.html