Codeforces Round # 632 (Div. 2) Número de coincidencias 12810
[codeforces 1333F] Kate y la imperfección suman primero todos los números primos, luego agregan el número con un divisor máximo de 2, seguido por el número con un divisor máximo de 3, y así sucesivamente
Ver https://blog.csdn.net/mrcrack/article/details/103564004 para el catálogo general
Dirección de evaluación en línea https://codeforces.com/contest/1333/problem/F
Problema | Solo | Veredicto | Hora | Memoria |
---|---|---|---|---|
F - Kate e imperfección | GNU C ++ 17 | Aceptado | 155 ms | 3900 KB |
El algoritmo manual es el siguiente
11
1 1 1 1 1 2 3 3 4 5
1,2,3,4,5,6,7,8,9,10,11
先加入所有质数,还包括了1,得到如下数据
1,2,3,5,7,11可以管到I2-I6的输出
1 1 1 1 1 1
I7的情况:1,2,3,5,7,11,4.加入了最大约数是4=2*2的情况。最大值gcd(2,4)=2
I8的情况:1,2,3,5,7,11,4,6.加入了最大约数是6=3*2的情况。最大值gcd(3,6)=3
I9的情况:1,2,3,5,7,11,4,6,9.加入了最大约数是9=3*3的情况。最大值gcd(3,9)=3
I10的情况:1,2,3,5,7,11,4,6,9,8.加入了最大约数是8=4*2的情况。最大值gcd(4,8)=4
I11的情况:1,2,3,5,7,11,4,6,9,8,10.加入了最大约数是10=5*2的情况。最大值gcd(5,10)=5
El código AC es el siguiente
#include <stdio.h>
#define maxn 500010
int p[maxn],ans[maxn],an=1;//p[i]=0表示i是质数
int main(){
int n,i,j;
scanf("%d",&n);
p[1]=1;//因之后的数据处理而设置
for(i=2;i<=n;i++)
for(j=i+i;j<=n;j+=i)//j是以i为约数的合数
p[j]=1;//合数
for(i=2;i<=n;i++)
if(p[i]==0)ans[++an]=1;//加入所有质数
for(i=2;i<=n;i++)//i是(i*j)对应的最大约数
for(j=1;i*j<=n;j++)
if(p[j]==0){//合数(i*j)另外一个因子是质数j
ans[++an]=i;//加入最大约数为i的合数(i*j);
if(!(i%j))break;//为了保证i是最大约数,此处必须中断
}
for(i=2;i<n;i++)printf("%d ",ans[i]);
printf("%d\n",ans[n]);
return 0;
}