Congruencia ---------- números más afortunados

8 es un número de la suerte en China, si uno digital en un 8 por constituye el número se denomina número de la suerte.
Ahora dado un número entero positivo L, pedir un número entero positivo de al menos 8 juntos forman un número (es decir, un mínimo número de la suerte) es un múltiplo de L.
Formato de entrada
de entrada comprende una pluralidad de casos de prueba.
En representación de cada línea de prueba, que contiene un número entero L.
Cuando la entrada Ejemplo l = 0, representa el termina de entrada, sin tener que lidiar con los casos.
Salida de formato de
fila de salida para cada caso de prueba.
El resultado es "Caso 1:" + un número entero N, N representativa de la condición del número mínimo de dígitos afortunados.
Si la condición no existe números de la suerte, entonces n = 0.
Rango de datos
1≤L≤2 * 1091≤L≤2 * 109
muestras de entrada:
8.
11.
16
0

Muestra de la salida:
. Caso 1 :. 1
Caso 2: 2
Caso 3:. 0

Ideas: tanto un producto de la multiplicación si la multiplicación de velocidad largo tiempo tortuga estallar de
las condiciones del teorema de Euler uso es a · n y primos entre
el razonamiento matemático razonable · un cálculo simplificado

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
LL qmul(LL a, LL k, LL b){
 LL res = 0;
 while(k){
  if (k & 1)   res = (res + a) % b;
  a = (a + a) % b;
  k >>= 1;
 }
 return res;
}
LL qmi(LL a, LL k, LL b){
 LL res = 1;
 while(k){
  if (k & 1)   res = qmul(res, a, b);
  a = qmul(a, a, b);
  k >>= 1;
 }
 return res;
}
LL get_euler(LL C){
 LL res = C;
 for (LL i = 2; i <= C / i; i ++)
    if (C % i == 0){
     while (C % i == 0)   C /= i;
     res = res / i * (i - 1);
    }
     if (C > 1)   res = res / C * (C - 1);
 return res;
}
int main(){
 int T = 1;
 LL L;
 while (cin >> L , L){
  int d = 1;
  while (L % (d * 2) == 0 && d * 2 <= 8)  d = d * 2;
    LL C = 9 * L / d;
  LL phi = get_euler(C);
    LL res = 1e18;
  if (C % 2 == 0 || C % 5 == 0)   res = 0;
  else{
   for (LL d = 1; d * d <= phi; d ++)
   if (phi % d == 0){
    if (qmi(10, d, C) == 1)   res = min(res, d);
    if (qmi(10, phi / d, C))  res = min(res, phi / d);
   }
  }
  printf("Case %d: %lld\n", T ++, res);
 }
 return 0;
}
Publicados 106 artículos originales · ganado elogios 67 · vistas 5417

Supongo que te gusta

Origin blog.csdn.net/qq_45772483/article/details/105027091
Recomendado
Clasificación