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时的特判吧。
博客内容涉及线性筛法在解决特定问题时的应用,通过特判处理n=1和n=2的情况,实现了AC(Accepted)的代码。线性筛法用于标记质数和合数,题目要求质因数与倍数颜色不同,最终代码展示并指出题目的简单性。

479

被折叠的 条评论
为什么被折叠?



