Competencia de programación para estudiantes universitarios de China 2020 (CCPC): prueba en línea

01
clase de arte

02
La clase de teoría de grafos
considera sumar puntos uno por uno, luego, si el punto x recién agregado es un número compuesto, entonces está conectado a un cierto factor y el peso total aumenta en x; si x es un número primo, entonces está conectado a 2 y el valor general aumenta Dos veces x. Ésta es la situación de conexión óptima.
Min25 tamiz para encontrar la suma del prefijo de los números primos dentro de n + 1, más 2 + 3 + 4 + ... n + 1.

#include <cstdio>
#include <cstring>
using namespace std;
const long long Nmax=10000000005ll;
const long long SQR=100005ll;
long long N,Ha,Haa,g[SQR*3],ans;
long long w[SQR*3],id1[SQR],id2[SQR],cnt;
long long f[SQR],P[SQR],SP[SQR],num;

void get_pri(long long Pmax)
{
    
    
	num=0;
	memset(f,0,sizeof(f));
	for (long long i=2; i<=Pmax; i++)
	{
    
    
		if (!f[i])
		{
    
    
			P[++num]=i;
			SP[num]=SP[num-1]+i;
		}
		for (long long j=1,k; j<=num && (k=i*P[j])<=Pmax; j++)
		{
    
    
			
			f[k]=1;
			if (i%P[j]==0)
				break;
		}
	}
}

void get_id()
{
    
    
	cnt=0;
	for (long long i=1,k; i<=N; )
	{
    
    
		k=N/i;			//g[k] 是需要的,将 k 离散出来 
		w[++cnt]=k;		//离散出的数中第 cnt 个为 k  
		if (k<=SQR)
			id1[k]=cnt;
		else
			id2[N/k]=cnt;
		i=N/k+1;	//使 k 跳到往后使 N/k 加 1 
	}
}

inline int ID(long long x){
    
    return (x<=SQR ? id1[x] : id2[N/x]);}

void get_g()
{
    
    
	long long X;
	for (int i=1; i<=cnt; i++)		//dp初始化, 即 j=0 时 g[w][j] 等于2~w累加 
	{
    
    
		g[i]=(w[i]+2)*(w[i]-1)/2;
	}
	for (int j=1; j<=num; j++)
	{
    
    
		for (int i=1; i<=cnt; i++)
		{
    
    
			if (P[j]*P[j]>w[i]) break;
			//X=((g[ID(w[i]/P[j])]-SP[j-1])%Ha+Ha)%Ha;
			X=g[ID(w[i]/P[j])]-SP[j-1];
			g[i]=g[i]-P[j]*X;
			//if (g[i]<0) g[i]=(g[i]%Ha+Ha)%Ha;
			//if (g[i]>Ha) g[i]%=Ha;
		}
	}
}

int main()
{
    
    
	long long T,n;
	scanf("%lld",&T);
	get_pri(SQR);

	
	while(T--)
	{
    
    
		ans=0;
		scanf("%lld%lld",&n,&Ha);
		Haa=Ha*Ha;
		N=n+1;
		get_id();
		get_g();
		ans=g[ID(N)]%Ha;
		ans=(ans+(n+3)%Ha*n%Ha*(Ha+1)/2%Ha)%Ha;		//2+3+...+(n+1)
		ans=(ans-4+Ha)%Ha;
		printf("%lld\n",ans);
	}
	
	return 0;
}

/*
1
260136231 19260817


*/

03
Clase de ajedrez

04
Clase de Ajedrez

05
Almuerzo

06
CCPC Training Class Para citar
algunos ejemplos, descubrí que poner todas las letras que aparecen más al principio es la mejor situación.

#include <cstdio>
int T,a[30],ans;
char ch;

int main()
{
    
    
    scanf("%d",&T);
    ch='a'-5;
    for (int kk=1; kk<=T; kk++)
    {
    
    
        for (int i=0; i<26; i++)
        	a[i]=0;
        while (ch<'a' || ch>'z')
        	ch=getchar();
        while (ch>='a' && ch<='z')
        {
    
    
            a[ch-'a']++;
            ch=getchar();
        }
        ans=0;
        for (int i=0; i<26; i++)
        	if (ans<a[i])
        		ans=a[i];
        printf("Case #%d: %d\n",kk,ans);
    }
    return 0;
}

07
Clase de educación física

08
clase de matemáticas

09
Informes

10
Convolución 3x3
Este punto de la imagen de multiplicación de matrices es para doblar la esquina superior izquierda de K al punto (i, j) en A, y luego asignar la suma de las posiciones superpuestas al nuevo punto (i, j). Si K es alguna Si la posición de algunos puntos excede A, ignore esas posiciones de K (es decir, multiplique si puede multiplicar).

Inserte la descripción de la imagen aquí

Al observar la muestra, puede adivinar que la respuesta se emite tal cual o solo 0.
Piense en cuándo se emite como es: solo cuando la respuesta es "K solo tiene un elemento distinto de cero en la esquina superior izquierda", se emite como es.
Si K es en otros casos, la respuesta es 0: tome el punto en la esquina inferior derecha de A como un avance, ya que la suma de K elementos es 1, si K tiene elementos distintos de cero en otros lugares además de la esquina superior izquierda, entonces para la esquina inferior derecha de A Después de cada multiplicación, disminuirá y disminuirá proporcionalmente a 0. De esta manera, los puntos alrededor de la esquina inferior derecha de A también seguirán disminuyendo, y así sucesivamente, toda la A eventualmente tenderá a 0 .
por lo que problema resuelto. Preste atención al formato (espacio al final de la línea).

#include <cstdio>

int main()
{
    
    
    //freopen("1.txt","w",stdout);
    int T,n,f,a[1000][1000],b[10];
    scanf("%d",&T);
    while (T--)
    {
    
    
        f=0;
        scanf("%d",&n);
        for (int i=1; i<=n; i++)
            for (int j=1; j<=n; j++)
                scanf("%d",&a[i][j]);
        for (int i=1; i<=9; i++)
        {
    
    
            scanf("%d",&b[i]);
            f+=b[i];
        }
        if (b[1]==f && f>0)
        {
    
    
            for (int i=1; i<=n; i++)
            {
    
    
                for (int j=1; j<=n; j++)
                {
    
    
                    if (j==n)
                        printf("%d",a[i][j]);
                    else
                        printf("%d ",a[i][j]);
                }
                printf("\n");
            }
        }
        else
        {
    
    
            for (int i=1; i<=n; i++)
            {
    
    
                for (int j=1; j<=n; j++)
                {
    
    
                    if (j==n)
                        printf("0");
                    else
                        printf("0 ");
                }
                printf("\n");
            }
        }
        
    }
    return 0;
}

11
Xor

12
polinomio residual

Supongo que te gusta

Origin blog.csdn.net/jackypigpig/article/details/108739912
Recomendado
Clasificación