P4626 一道水题 II
求 $lcm[1, \ldots n]$ 。筛出质数,考虑每个质数的最大指数。
注意到 $n$ 很大,空间限制不能直接开 $10 ^ 8$ 个 int ,所以用 bitset 。
 查看代码 
| 12
 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
 
 | #include <cstdio>#include <bitset>
 using namespace std;
 template <class Type>
 void read(Type &x)
 {
 char c;
 bool flag = false;
 while ((c = getchar()) < '0' || c > '9')
 c == '-' && (flag = true);
 x = c - '0';
 while ((c = getchar()) >= '0' && c <= '9')
 x = (x << 3) + (x << 1) + c - '0';
 if (flag) x = ~x + 1;
 }
 template <class Type, class ...rest>
 void read(Type &x, rest &...y) { read(x), read(y...); }
 template <class Type>
 void write(Type x)
 {
 if (x < 0) putchar('-'), x = ~x + 1;
 if (x > 9) write(x / 10);
 putchar(x % 10 + '0');
 }
 typedef long long LL;
 const int N = 1e8 + 10, M = 5761456 + 10, mod = 1e8 + 7;
 bitset <N> vis;
 int n, cnt, p[M];
 void init ()
 {
 vis[1] = true;
 for (int i = 2; i <= n; ++i)
 {
 if (!vis[i]) p[++cnt] = i;
 for (int j = 1; j <= cnt && (LL)i * p[j] <= n; ++j)
 {
 vis[i * p[j]] = true;
 if (i % p[j] == 0) break;
 }
 }
 }
 int main ()
 {
 read(n);
 init();
 int res = 1;
 for (int i = 1; i <= cnt; ++i)
 {
 int t = p[i];
 while ((LL)t * p[i] <= n) t *= p[i];
 res = (LL)res * t % mod;
 }
 write(res), puts("");
 return 0;
 }
 
 |