线性筛&&欧拉函数刷题小结
线性筛
板子题
链接:P3383 【模板】线性筛素数
题目分析: 非常的简单~
Code:
#include<bits/stdc++.h>
using namespace std;
inline int Read(){
int fh=1,dx=0;
char c;
c=getchar();
while(c>'9'||c<'0'){
if(c=='-') fh=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
dx=dx*10+c-'0';
c=getchar();
}
return fh*dx;
}
bool f[100000009];
int n,q,k,p[6000000],cnt;
void GeiYeShai(){
f[0]=1;f[1]=1;
for(int i=2;i<=n;++i){
if(f[i]==0) p[++cnt]=i;
for(int j=1;j<=cnt&&p[j]*i<=n;++j){
f[p[j]*i]=1;
if(i%p[j]==0) break;
}
}
}
int main(){
n=Read();q=Read();
GeiYeShai();
for(int i=1;i<=q;++i){
k=Read();
printf("%d\n",p[k]);
}
return 0;
}
反思与总结
非常简单的板子题也要做,打好基础
A%B Problem
链接:P1865:A%B Problem
题目分析: 非常的简单~,结合一下前缀和即可随手切
Code:
#include<bits/stdc++.h>
using namespace std;
inline int Read(){
int fh=1,dx=0;
char c;
c=getchar();
while(c>'9'||c<'0'){
if(c=='-') fh=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
dx=dx*10+c-'0';
c=getchar();
}
return fh*dx;
}
bool f[1000009];
int n,q,k,p[800000],cnt,num[1000003];
void GeiYeShai(){
f[0]=1;f[1]=1;
num[1]=0;
for(int i=2;i<=q;++i){
if(f[i]==0) p[++cnt]=i;
for(int j=1;j<=cnt&&p[j]*i<=q;++j){
f[p[j]*i]=1;
if(i%p[j]==0) break;
}
num[i]=num[i-1]+1-f[i];
}
}
int main(){
n=Read();q=Read();
GeiYeShai();
for(int i=1;i<=n;++i){
int le=Read(),ri=Read();
if(ri>q||le<1) printf("Crossing the line\n");
else printf("%d\n",num[ri]-num[le-1]);
}
return 0;
}
总结与反思:
粘板子题的代码时要改根据输入数据的不同改变量名称
欧拉函数
T o To To b e be be c o n t i n u e d continued continued