1.线性筛 特判
ybt
通过
测试点 | 结果 | 内存 | 时间 |
测试点1 | 答案正确 | 616KB | 2MS |
测试点2 | 答案正确 | 616KB | 2MS |
测试点3 | 答案正确 | 616KB | 1MS |
测试点4 | 答案正确 | 620KB | 1MS |
测试点5 | 答案正确 | 624KB | 2MS |
测试点6 | 答案正确 | 624KB | 2MS |
测试点7 | 答案正确 | 632KB | 2MS |
测试点8 | 答案正确 | 1048KB | 6MS |
测试点9 | 答案正确 | 1044KB | 6MS |
测试点10 | 答案正确 | 764KB | 3MS |
LOJ
该题有一个问题,样例给的范围太小,让人难以弄明白问题所在,在想质数都标记1,合数都标记2,不就好了吗,真实题意肯定不是如此。
先按上述编了再说, 很快AC通过。
题目好废啊:
毕竟只需要质因数与倍数之间的颜色不同; 那么很容易就知道一共就只有两个颜色; 一个颜色用了涂质数的; 一个涂非质数的; 反正好废啊!
线性筛 特判 代码如下:
#include <bits/stdc++.h>
#define maxn 100010
using namespace std;
int b[maxn],prime[maxn],tot=0;
void linear(int x){
int i,j;
for(i=2;i<=x;i++)b[i]=0;
for(i=2;i<=x;i++){
if(b[i]==0)prime[++tot]=i;
for(j=1;j<=tot&&i*prime[j]<=x;j++){
b[i*prime[j]]=1;
if(i%prime[j]==0)break;
}
}
}
int main(){
int n,i;
scanf("%d",&n);
if(n==1){//特判
printf("1\n1\n");
return 0;
}
if(n==2){//特判
printf("1\n1 1\n");
return 0;
}
linear(n+1);
printf("2\n");
printf("1");
for(i=3;i<=n+1;i++){
if(b[i]==0)printf(" 1");
else printf(" 2");
}
printf("\n");
return 0;
}
该题习得什么?主要还是n=1,n=2时的特判吧。