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:
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;
}