LightOJ 1289 LCM from 1 to n
来源:互联网 发布:mac芯片 编辑:程序博客网 时间:2024/06/08 03:54
LCM FROM 1 TO N
题意: 求1 到 n 的LCM(最小公倍数)
素数的另外一种筛法: (大概就是欧拉筛的优化)
思路: 首先求1 ~n 的LCM ,只需要求出 n 以内的所有素数的最高次幂。
10: 2^3*3^2*5*7
5: 2^2*3*5
又由于 直接筛出 1e8 的素数会爆内存。
所以要用一个叫 位图 的来优化存储。
位图模板:
#define INT_BITS sizeof(int)#define SHIFT 5 // 2^5=32#define MASK 0x1f // 2^5=32#define MAX 1024*1024*1024 //max numberint bitmap[MAX / INT_BITS];/** 设置第i位 * i >> SHIFT 相当于 i / (2 ^ SHIFT), * i&MASK相当于mod操作 m mod n 运算 */void set(int i){ bitmap[i >> SHIFT] |= 1 << (i & MASK);}//获取第i位 int test(int i){ return bitmap[i >> SHIFT] & (1 << (i & MASK));}//清除第i位int clear(int i){ return bitmap[i >> SHIFT] & ~(1 << (i & MASK));}
代码:
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int N =100000007;int vis[N/32+50];typedef long long ll ;ll MOD=1ll<<32;int pri[6000000],len=0;unsigned int sum[6000000];bool Get(int i){ int x=i/32,y=i%32; return 1<<y & vis[x];}void Set(int i){ int x=i/32,y=i%32; vis[x]|=1<<y;}void init(){ len=0; for(int i=2;i<=N;i++) { if(!Get(i)) pri[len++]=i; for(int j=0;j<len&&i*pri[j]<=N;j++) { Set(i*pri[j]); if(i%pri[j]==0) break; } } sum[0]=pri[0]; for(int i = 1;i < len; i++) sum[i] = (ll)sum[i-1]*pri[i]%MOD;}unsigned int solve(int n){ int p=upper_bound(pri,pri+len, n)-pri-1; //找到最接近n 的素数 unsigned int ans=sum[p]; for(int i=0;i<len&&pri[i]*pri[i]<=n;i++) { int mx=pri[i]; int tm=pri[i]*pri[i]; while(tm/mx==pri[i]&&tm<=n) //防止 爆 int; { tm*=pri[i]; mx*=pri[i]; } ans*=(mx/pri[i]); } return ans;}int main(){ int T; scanf("%d",&T); int kase=1; init(); while(T--) { int n; scanf("%d",&n); printf("Case %d: %u\n",kase++,solve(n)); } return 0;}
阅读全文
0 0
- lightoj 1289 LCM from 1 to n
- LightOJ 1289 LCM from 1 to n
- LightOJ 1289 LCM from 1 to n
- LightOJ 1289 LCM from 1 to n
- LightOJ 1289 LCM from 1 to n (节省空间的素数筛法+n个数的最小公倍数)
- LCM from 1 to n
- LCM from 1 to n
- LIGHT OJ 1289 LCM from 1 to n
- Light OJ 1289 LCM from 1 to n(lcm问题+内存优化)
- Light OJ 1289 LCM from 1 to n(LCM结论+内存优化)
- 【数论】【算术基本定理】[LightOJ1289]LCM from 1 to n
- Light 1289 LCM from 1 to n 素数筛选位优化
- LightOJ 1024 - Eid (高精度求n个数的LCM)
- LightOJ 1236 Pairs Forming LCM(lcm(i, j) = n的对数)
- lightOJ 1215 Finding LCM
- Pairs Forming LCM LightOJ
- Pairs Forming LCM LightOJ
- LightOJ 1245 求(n/1+n/2+...+n/n)
- 如何解决使用addBatch()和executeBatch()无法批量增加删除修改数据库数据等问题
- 6.Redis的事务
- py-faster-rcnn用自己的数据训练模型
- mac Java多版本配置
- 此声明没有存储类或类型说明符?
- LightOJ 1289 LCM from 1 to n
- ubuntu14.04更新gcc/g++4.9.2
- String类型的方法
- 每天积累(四)--mybatis二级缓存
- 基于redis(key分段,避免一个key过大) 和db实现的 布隆过滤器(解决hash碰撞问题)
- Java反射机制,入门初探
- python读取cvs文件并写入mongodb
- Python连接MySQL数据库
- 给初学者的RxJava2.0教程(一)