LibieOJ 6165 一道水题 (线性筛)

题目链接 LOJ6165

题目意思其实就是求LCM(1, 2, 3, ..., n)

直接用线性筛求出1到1e8之间的所有质数

然后对于每个质数p,他对答案的贡献为$p^{i}$ 其中$p^{i}$小于等于n且要最大。

c数组可能很大,所以我开了bitset...

#include <bits/stdc++.h>

using namespace std;

#define rep(i, a, b)	for (int i(a); i <= (b); ++i)
#define dec(i, a, b)	for (int i(a); i >= (b); --i)

typedef long long LL;

const int N  =  6170736;
const int M  = 100000002;
const LL mod = 100000007;

int n, pn;
int p[N];
bitset <M> c;
LL ans = 1LL;
int v;

int main(){

	scanf("%d", &n);
	pn = 0;
	rep(i, 2, n){
		if (!c[i]){
			p[++pn] = i;
			for (LL s = i; s <= n; s *= i)
				ans = ans * i % mod;
		}

		rep(j, 1, pn){
			v = i * p[j];
			if (v > n) break;
			c[v] = 1;
			if (i % p[j] == 0) break;
		}
	}
	printf("%lld\n", ans);
	return 0;
}

 

转载于:https://www.cnblogs.com/cxhscst2/p/7418253.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值