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

编程入门 行业动态 更新时间:2024-10-11 17:23:39

Light 1289 LCM from 1 to n <a href=https://www.elefans.com/category/jswz/34/1764940.html style=素数筛选位优化"/>

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;}elser = 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 素数筛选位优化

本文发布于:2024-03-07 18:46:45,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1718621.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:素数   Light   LCM

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!