素数筛选

hrbust 1328

丶灬走出姿态 提交于 2020-01-08 13:19:02
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 题目链接: hrbust 1328 这是一道数论的题目,求解方法还是挺巧妙的,尽管够基础。 首先要知道的是多个数的最小公倍数究竟怎么求,有一个公式为lcm(a, b, c) = lcm(lcm(a,b),c),这个公式对n个数一样也成立。 还有一种求法,是将这多个数均写成素数因子的幂相乘的形式(唯一分解定理),然后对每个素数因子,只取最大的指数,相乘就是最小公倍数了。 这里用的是第二种想法,其实这种想法也是够直观,最接近直觉的。如果A(n)和A(n-1)是相等的,那么说明n的素数因子幂相乘的形式中,没有一个素数因子的幂是大于A(n-1)对应素数的幂的。 而如果n含有两个及以上素数因子,比如(a^x)*(b^y),那x和y均不会超过A(n-1)对应素数的幂,因为a^x和b^y都是小于n的,A(n-1)中a和b的指数一定大于等于x和y。如果n可以写成a^x这种形式,那么在A(n-1)的a因子的指数一定不会超过x,因为这么大的指数是第一次出现的(特别地,当x为1时,n为素数)。 #include <cstdio> #include <vector> #include <iostream> using namespace std; vector<int> primes; int not_prime[1010]; int