又重新统一了下线性筛法模版
void linear_prime(int wt)//线性筛法筛质数
{
for(int i = 2; i <= wt ; ++i)
{
if(!b[i]) prime[++prime[0]] = i;
for(int j = 1; j <= prime[0] && i * prime[j] <= wt; ++j)
{
b[i * prime[j]] = 1;
if(i % prime[j] == 0) break;
}
}
}
基础知识见此
http://www.cppblog.com/jie414341055/archive/2010/07/19/113882.html
应用见此 http://blog.youkuaiyun.com/a2520123/article/details/7906407
进阶 http://blog.sina.com.cn/s/blog_7812e986010118m3.html
我就贴贴代码与题目解析吧
1. http://acm.hdu.edu.cn/showproblem.php?pid=2136
给n,求1~n中最大质因子的序号
在线筛过程中用质因子位置不断更新合数位置
#include <cmath>
#include <cstdio>
#include <iostream>
using namespace std;
const int limt = 1000000;
const int maxn = 1000000 + 5;
bool b[maxn];
int n, prime[maxn], wh[maxn];
int linear_prime(int wt)
{
int k = 0; memset(b, 0, sizeof(b));
for(int i = 2; i <= wt ; ++i)
{
if(!b[i]) prime[k++] = i, wh[i] = k;
for(int j = 0; j < k && i * prime[j] < wt; ++j)
{
b[i * prime[j]] = 1; wh[i * prime[j]] = wh[i];
if(i % prime[j] == 0) break;
}
}
return k;
}
int main()
{
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
int lpn = linear_prime(limt);
for (; ~scanf("%d\n", &n); printf("%d\n", wh[n]));
return 0;
}
2.LYP蒯的主席原创题
老规矩,公式不太好发就截图吧
持续更新类