AtCoder Beginner Contest 161 F División o resta mesa de juego + reglas de búsqueda + teoría de números

AtCoder Beginner Contest 161 El número de concursantes es 9927. Rápido, vea todas las preguntas 5 minutos después del comienzo del concurso.

AtCoder Beginner Contest 161 F División o resta mesa de juego + reglas de búsqueda + teoría de números

Ver https://blog.csdn.net/mrcrack/article/details/104454762 para el catálogo general

Dirección de evaluación en línea https://atcoder.jp/contests/abc161/tasks/abc161_f

La simulación de muestra es la siguiente

6

3

2:6/2=3,3-2=1选
3:6/3=2不选
4:6-4=2不选
5:6-5=1选
6:6/6=1选



Para obtener más datos, escribí el código de la tabla, de la siguiente manera

#include <stdio.h>
#define LL long long
int judge(LL x,LL n){
	while(n>=x){
		if(n%x==0)n/=x;
		else n-=x;
	}
	if(n==1)return 1;
	else return 0;
}
int main(){
	LL i,n,k,j;
	scanf("%lld",&n);
	for(i=2;i<=n;i++){
		printf("%lld\n",i);
		for(j=2;j<=i;j++)
			if(judge(j,i))printf("%lld ",j);
		printf("\n\n");
	}
	return 0;
}

Compile el código anterior, ejecute, ingrese 100 y obtenga los datos de salida de la siguiente manera

2
2 

3
2 3 

4
2 3 4 

5
2 4 5 

6
2 5 6 

7
2 3 6 7 

8
2 7 8 

9
2 3 4 8 9 

10
2 3 9 10 

11
2 5 10 11 

12
2 3 11 12 

13
2 3 4 6 12 13 

14
2 13 14 

15
2 7 14 15 

16
2 3 4 5 15 16 

17
2 4 8 16 17 

18
2 17 18 

19
2 3 6 9 18 19 

20
2 4 19 20 

21
2 3 4 5 10 20 21 

22
2 3 7 21 22 

23
2 11 22 23 

24
2 23 24 

25
2 3 4 5 6 8 12 24 25 

26
2 5 25 26 

27
2 3 13 26 27 

28
2 3 9 27 28 

29
2 4 7 14 28 29 

30
2 3 5 29 30 

31
2 3 5 6 10 15 30 31 

32
2 31 32 

33
2 4 8 16 32 33 

34
2 3 11 33 34 

35
2 17 34 35 

36
2 3 4 5 6 7 35 36 

37
2 3 4 6 9 12 18 36 37 

38
2 37 38 

39
2 3 19 38 39 

40
2 3 13 39 40 

41
2 4 5 8 10 20 40 41 

42
2 6 41 42 

43
2 3 6 7 14 21 42 43 

44
2 43 44 

45
2 4 11 22 44 45 

46
2 3 5 9 15 45 46 

47
2 23 46 47 

48
2 3 47 48 

49
2 3 4 6 7 8 12 16 24 48 49 

50
2 7 49 50 

51
2 5 10 25 50 51 

52
2 3 4 17 51 52 

53
2 4 13 26 52 53 

54
2 53 54 

55
2 3 5 6 9 18 27 54 55 

56
2 5 7 11 55 56 

57
2 3 4 7 8 14 28 56 57 

58
2 3 19 57 58 

59
2 29 58 59 

60
2 59 60 

61
2 3 4 5 6 10 12 15 20 30 60 61 

62
2 61 62 

63
2 3 31 62 63 

64
2 3 4 7 8 9 21 63 64 

65
2 4 8 16 32 64 65 

66
2 3 5 13 65 66 

67
2 3 6 11 22 33 66 67 

68
2 4 67 68 

69
2 4 17 34 68 69 

70
2 3 23 69 70 

71
2 5 7 10 14 35 70 71 

72
2 8 71 72 

73
2 3 4 6 8 9 12 18 24 36 72 73 

74
2 73 74 

75
2 3 37 74 75 

76
2 3 5 15 25 75 76 

77
2 4 19 38 76 77 

78
2 6 7 11 77 78 

79
2 3 6 13 26 39 78 79 

80
2 4 5 79 80 

81
2 3 4 5 8 9 10 16 20 40 80 81 

82
2 3 9 27 81 82 

83
2 41 82 83 

84
2 3 4 83 84 

85
2 3 4 6 7 12 14 21 28 42 84 85 

86
2 5 17 85 86 

87
2 43 86 87 

88
2 3 29 87 88 

89
2 4 8 11 22 44 88 89 

90
2 3 9 89 90 

91
2 3 5 6 9 10 15 18 30 45 90 91 

92
2 7 13 91 92 

93
2 3 4 23 46 92 93 

94
2 3 31 93 94 

95
2 47 94 95 

96
2 5 19 95 96 

97
2 3 4 6 8 12 16 24 32 48 96 97 

98
2 97 98 

99
2 7 14 49 98 99 

100
2 3 4 9 10 11 33 99 100 

La idea está tomada de https://www.cnblogs.com/zcr-blog/p/12634639.html

La simulación manual es la siguiente

100
2 3 4 9 10 11 33 99 100
 
以上面数据作为说明
2<=k<=100
1.不是100的约数,那么是100-1=99的约数
k可取3,33,9,11,99
2.是100的约数,
备选数据有2,50,4,25,5,20,10,100
2:100/2=50,50/2=25,25%2=1选
50:100/50=2不选
4:100/4=25,25%4=1选
25:100/25=4不选
5:100/5=20,20/5=4不选
20:100/20=5不选
10:100/10=10,10/10=1选
100:100/100=1选
k可取2,4,10,100

综合两种情况,k可取3,33,9,11,99,2,4,10,100

1 no es un divisor de n

Esta situación es relativamente simple: no es el divisor de n. Según la idea, n siempre disminuirá en k a n <k.

El resultado final es en realidad el n-módulo k.

Lo que necesitamos encontrar es en realidad todo k tal que n modo k = 1.

Este es en realidad el divisor de n − 1, así que simplemente consulta el número de divisores (excluyendo 1) de n − 1. Complejidad del tiempo: O (√n)

k no es un divisor de n, sino un divisor de n-1. La prueba es la siguiente:

n% k = 1, es decir n = kx + 1, x es un número entero, entonces n-1 = kx, disponible (n-1)% k = 0, k es un divisor de n-1

2 es un divisor de n

En realidad, es mejor pensar en esta situación.

Primero debemos encontrar todos los divisores (sin incluir 1), la complejidad de hacerlo es O (√n)

De acuerdo con la pregunta, necesitamos dividir por este divisor continuamente, y debido a que k≥2, esto es O (logn).

Cuando no es divisible, se convierte en 1, y el resultado será n módulo k (n debería ser n después de dividir por k varias veces). Si n módulo k == 1, entonces ans ++.

La complejidad total es O (√nlog√n).

Recuerde que n debe ser un k que satisfaga la condición.

Recuerde hacer un juicio especial de "2".

Estos dos casos no tienen el mismo factor porque los números naturales adyacentes son relativamente primos. (Desde https://www.cnblogs.com/st1vdy/p/12634767.html )

El código AC es el siguiente

#include <stdio.h>
#define LL long long
LL n,cnt;
int judge(LL k,LL m){
	while(m>=k){
		if(m%k==0)m/=k;
		else m%=k;
	}
	if(m==1)return 1;
	else return 0;
}
int main(){
	LL i;
	scanf("%lld",&n);
	if(n==2){printf("1\n");return 0;}//注意n=2需特判
	for(i=2;i*i<=n-1;i++)//找n-1的约数
		if((n-1)%i==0){
			cnt++;
			if(i!=(n-1)/i)cnt++;
		}
	cnt++;//加上n-1本身
	for(i=2;i*i<=n;i++)
		if(n%i==0){
			if(judge(i,n))cnt++;
			if(i!=n/i&&judge(n/i,n))cnt++;
		}
	cnt++;//加上n本身
	printf("%lld\n",cnt);
}

 

Publicado 660 artículos originales · elogiado 562 · 480,000 visitas

Supongo que te gusta

Origin blog.csdn.net/mrcrack/article/details/105328049
Recomendado
Clasificación