Light 1289 LCM from 1 to n 素数筛选位优化

题目来源:Light 1289 LCM from 1 to n

题意:。。

思路:从1到n 打过某个数是以一个素数的几次方 那么答案就乘以这个素数

主要是筛选素数 存不下 位优化 一个整数32位标记32个数 内存缩小32倍

是学习别人的

#include <cstdio>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
const int maxn = 100000010;
const int maxm = 6000000;
unsigned int dp[maxm];
int prime[maxm];
int vis[maxn/32+10];
//筛素数
int sieve()
{
	//memset(vis, 0, sizeof(vis));
	//vis[0] = vis[1] = 1;
	prime[0] = 2;
	dp[0] = 2;
	int c = 0;
	for(int i = 3; i < maxn; i += 2)
	{
		if(!(vis[i/32]&(1<<(i%32))))
		{
			prime[++c] = i;
			dp[c] = dp[c-1] * i;
			for(int j = i*2; j < maxn; j += i)
				vis[j/32] |= (1<<(j%32));
		}
	}
	return c;
}

int main()
{
	int c = sieve();
	int cas = 1;
	int T;
	scanf("%d", &T);
	while(T--)
	{
		int n;
		scanf("%d", &n);
		int l = 0, r = c-1, m;
		while(l <= r)
		{
			int mid = (l + r) >> 1;
			if(prime[mid] <= n)
			{
				m = mid;
				l = mid + 1;
			}
			else
				r = mid - 1;
		}
		//printf("%d\n", m);
		unsigned int ans = dp[m];
		for(int i = 0; i <= m && prime[i]*prime[i] <= n; i++)
		{
			int x = prime[i];
			int y = prime[i]*prime[i];

			while(y <= n && y / x == prime[i])
			{
				//printf("**%d", y);
				ans *= prime[i];
				x *= prime[i];
				y *= prime[i];
			}
			//ans *= x;
		}
		printf("Case %d: %u\n", cas++, ans);
	}
	return 0;
}

Light 1289 LCM from 1 to n 素数筛选位优化,布布扣,bubuko.com

时间: 2024-11-10 02:52:06

Light 1289 LCM from 1 to n 素数筛选位优化的相关文章

LightOJ 1236 Pairs Forming LCM (LCM 唯一分解定理 + 素数筛选)

http://lightoj.com/volume_showproblem.php?problem=1236 Pairs Forming LCM Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu Submit Status Practice LightOJ 1236 Description Find the result of the following code: long long pairs

Light OJ 1356 Prime Independence 最大独立集+素数筛选

题目来源:Light OJ 1356 Prime Independence 题意:给你n个数 选出最多的数构成一个集合使得任何2个数不是另外一个数的质数倍 x!=k*y 思路:矛盾的2个数连边 并且所有数分成质因子数为奇数和偶数两部分 以质因子奇偶不同构建二分图 同奇或者同偶的数一定不是另外一个数的质数倍 判断矛盾 首先对每个数因子分解 例如x 有a1个p1质因子 a2个p2质因子...an个pn质因子 x的质因子个数为a1+a2+...+an 记为sum 判断是否存在x/p1  x/p2 ..

LightOJ 1289 LCM from 1 to n

1289 - LCM from 1 to n Given an integer n, you have to find lcm(1, 2, 3, ..., n) lcm means least common multiple. For example lcm(2, 5, 4) = 20, lcm(3, 9) = 9, lcm(6, 8, 12) = 24. Input Input starts with an integer T (≤ 10000), denoting the number of

Light OJ 1197 1197 - Help Hanzo(大区间素数筛选)

Amakusa, the evil spiritual leader has captured the beautiful princess Nakururu. The reason behind this is he had a little problem with Hanzo Hattori, the best ninja and the love of Nakururu. After hearing the news Hanzo got extremely angry. But he i

1341 - Aladdin and the Flying Carpet ---light oj (唯一分解定理+素数筛选)

http://lightoj.com/volume_showproblem.php?problem=1341 题目大意: 给你矩形的面积(矩形的边长都是正整数),让你求最小的边大于等于b的矩形的个数. 什么叫唯一分解定理:算术基本定理可表述为:任何一个大于1的自然数 N,如果N不为质数,那么N可以唯一分解成有限个质数的乘积N=P1a1P2a2P3a3......Pnan,这里P1<P2<P3......<Pn均为质数,其中指数ai是正整数.这样的分解称为 N 的标准分解式 我们求出n的因

hdu 5407 CRB and Candies(素数筛选法,除法取模(乘法逆元))

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5407 解题思路: 官方题解: The problem is just to calculate g(N) =\ LCM(C(N,0), C(N,1), ..., C(N, N))g(N) = LCM(C(N,0),C(N,1),...,C(N,N)). Introducing function f(n) =\ LCM(1, 2, ..., n)f(n) = LCM(1,2,...,n), the

O(N)的素数筛选法和欧拉函数

首先,在谈到素数筛选法时,先涉及几个小知识点. 1.一个数是否为质数的判定. 质数,只有1和其本身才是其约数,所以我们判定一个数是否为质数,只需要判定2~(N - 1)中是否存在其约数即可,此种方法的时间复杂度为O(N),随着N的增加,效率依然很慢.这里有个O()的方法:对于一个合数,其必用一个约数(除1外)小于等于其平方根(可用反证法证明),所以我们只需要判断2-之间的数即可. bool is_prime(int num) { const int border = sqrt(num); for

[email&#160;protected] Sieve of Eratosthenes (素数筛选算法) &amp; Related Problem (Return two prime numbers )

Sieve of Eratosthenes (素数筛选算法) Given a number n, print all primes smaller than or equal to n. It is also given that n is a small number. For example, if n is 10, the output should be “2, 3, 5, 7″. If n is 20, the output should be “2, 3, 5, 7, 11, 13,

HDU 2161 Primes (素数筛选法)

题意:输入一个数判断是不是素数,并规定2不是素数. 析:一看就很简单吧,用素数筛选法,注意的是结束条件是n<0,一开始被坑了... 不说了,直接上代码: #include <iostream> #include <cstdio> #include <cstring> #include <cmath> using namespace std; typedef long long LL; const int maxn = 16000 + 10; int p