Codeforces Ronda # 657 (Div. 2) —— B. Cyrpto dudoso 题 解

2020/7/20
题目 : A
Pasha le encanta enviar números enteros estrictamente positivos a sus amigos. Pasha se preocupa por la seguridad, por lo tanto, cuando quiere enviar un número entero n, lo encripta de la siguiente manera: escoge tres enteros a, byc tales que l≤a, b, c≤r, y luego calcula el cifrado valor m = n⋅a + b − c.

Desafortunadamente, un adversario interceptó los valores l, r y m. ¿Es posible recuperar los valores originales de a, byc a partir de esta información? Más formalmente, se le pide que encuentre cualquier valor de a, byc tal que

a, byc son números enteros,
l≤a, b, c≤r,
existe un número entero estrictamente positivo n, tal que n⋅a + b − c = m. El
significado de la
pregunta : El significado de la pregunta es muy simple, dale l, r, m, vamos a encontrar a, b, c (todos entre lyr), hay un entero positivo n tal que n * a + bc = m;

Idea:
Primero considere la diferencia entre n * a y m. No es difícil encontrar que para todos los enteros positivos n, la diferencia mínima entre n * a y m es m% a y am% a (cuando a> m, solo am% a). Vea la figura para más detalles:
Inserte la descripción de la imagen aquí
Por lo tanto, si quiere hacer n * a + bc = m, solo necesita | bc |> = m% a, o | bc | <= am% a. (O si i> m, solo | bc | <= am% a), fácil de obtener | bc | <= rl. Entonces, solo necesitamos enumerar a de la r para ver si existen las condiciones anteriores, y luego asignar valores de acuerdo con la diferencia.
Código:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    
    
	int t;
	cin >> t;
	while (t--)
	{
    
    
		long long l, r, m;
		cin >> l >> r >> m;
		long long i;
		long long a, b, c;
		for (i = l; i <= r; i++)
		{
    
    
			if (m >= i)
			{
    
    
				if (m % i<= (r - l))
				{
    
    
					a = i;
					c = l;
					b = l + m % i;
					break;
				}
				if (i - m % i <= (r - l))
				{
    
    
					a = i;
					b = l;
					c = l + i - m % i;
					break;
				}
			}
			else
			{
    
    
				if (i-m <= (r - l))
				{
    
    
					a = i;
					b = l;
					c = l + i - m;
					break;
				}
			}
		}
		cout << a << ' ' << b << ' ' << c << endl;
	}
	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/ylwhxht/article/details/107454689
Recomendado
Clasificación