Examen du concours AtCoder Beginner Contest 156, jusqu'à la question E (Python)

Ceci est un article de synthèse pour les débutants des professionnels de la compétition.

La solution que j'écris ici est écrite en regardant les commentaires et les soumissions d'autres personnes. Ce n'est peut-être pas ce que vous avez réellement soumis.

A - Beginner Sur un certain site de compétition pro, il semble que la note des personnes avec un petit nombre de fois soit affichée plus haut que la note interne. La notation interne réelle est la question qui répond à certains.

Si le nombre de fois N est égal ou supérieur à 10, émettez tel quel. S'il est inférieur à 10, la valeur obtenue en ajoutant la valeur de correction 100 $ \ times (10-N) $ sera la note interne.

N, R = map(int, input().split())
if N < 10:
  print(R + 100 * (10-N))
else:
  print(R)

B - Digits C'est une question de savoir combien de chiffres seront quand la valeur numérique N est exprimée en notation K.

Pensez à l'emplacement du plus grand chiffre. Par exemple, si $ N = 9, K = 2 $, $ 1000 $, soit 2 $ ^ 3 $, sera le plus grand chiffre et $ r = 4 $ sera obtenu. En exprimant cela dans une formule mathématique, nous pouvons trouver un multiplicateur r qui satisfait ce qui suit.

K^{r-1} \leq N < K^{r}

J'ai simplement mis en œuvre cela.

N, K = map(int, input().split())
r = 1
while not(K**(r-1) <= N and N < K ** r):
  r += 1
print(r)

Cela s'est passé sans aucun problème, mais quand j'ai regardé l'explication, la méthode était différente.

Le nombre de chiffres à calculer est $ D $, et la valeur de chaque chiffre est $ a_ {D-1}, \ cdots, a_1, a_0 $ Puis $ $

N = a_{D-1}K^{D-1} + \cdots + a_1 K^1 + a_0 K^0

Il est exprimé par la formule.

Si vous répétez l'opération consistant à diviser $ N $ par $ K $ et en prenant le quotient, le quotient sera de 0 $ lorsque $ D $ est divisé par $ K $.

Implémentons ceci.

N, K = map(int, input().split())
D = 0
while N:
  N //= K
  D += 1
print(D)

Il n'y avait aucun problème avec le temps de calcul.

C - Rally

La question est de répondre où se trouve le point (valeur entière) où l'erreur carrée est la plus petite pour ceux placés sur la droite numérique.

La méthode du carré minimum est associée à l'énoncé du problème, mais N et X ont tous deux une plage étroite de 1 à 100. J'ai décidé que je n'avais pas besoin de compétences mathématiques parce que $ O (N ^ 2) $ passait sans aucun problème, alors j'ai simplement cherché partout.


N = int(input())
X = list(map(int, input().split()))
minLoss = 1e6
for i in range(1, 101):
  minLoss = min(minLoss, sum([(x - i)**2 for x in X]))
print(minLoss)

Je suis passé par là.

Je pense que ce serait un peu plus efficace si les plages gauche et droite étaient définies sur les valeurs minimale et maximale de X au lieu de 1 à 100.

D - Bouquet Combien de combinaisons peuvent être prises à partir de N fleurs différentes? Cependant, a et b ne peuvent pas être supprimés. C'est le problème.

TLE parce que j'ai essayé de trouver une combinaison avec $ _nC_r $ pour chaque nombre n de 1 à N. J'ai abandonné.

J'ai vu le commentaire. "Toutes les combinaisons pour tous les nombres" est beaucoup plus facile à calculer.

Il n'y a que deux options pour chaque fleur, «utiliser» et «ne pas utiliser». Donc, toutes les combinaisons valent 2 $ ^ N $. Cependant, la combinaison qui utilise 0 est exclue, donc c'est exactement $ 2 ^ N-1 $.

Il peut être obtenu en soustrayant les combinaisons à exclure de $ _nC_r $ pour a et b.

from scipy.misc import comb
m = 1000000007
n, a, b = map(int, input().split())
out = 2**n - comb(n, a) - comb(n, b)
print(out%m)

Ce n'était pas bon. Le problème est que 2 ** n, $ _nC_a et _nC_b $ sont trop nombreux.

Pour se débarrasser de ça Il faut réduire le calcul par une méthode mathématique utilisant la condition "reste divisé par 10 $ ^ 9 + 7 $".

Tout d'abord, considérons le multiplicateur de 2. En python, vous pouvez utiliser pow () au lieu de ** pour spécifier le nombre à diviser par le troisième argument, et le calcul du reste peut être effectué à grande vitesse.

print(pow(2, 4, 3)) # 1

Ensuite, envisagez d'accélérer le calcul des combinaisons.

Il y a le théorème de Fermat. Quand $ p $ est un nombre premier et $ a $ et $ p $ sont premiers l'un par rapport à l'autre

a^{p-1} \equiv 1~~(\rm{mod}~ p)

Est établi. Autrement dit, en divisant a par la puissance p-1 de p donne 1. Il semble. Je ne savais pas.

Je ne l'ai pas vraiment ressenti, alors je vais essayer.

p = 29
for a in range(3, 29, 5):
  print("a: {}, p: {}, a^(p-1)%p: {}".format(a, p, pow(a, p-1, p)))
'''
a: 3, p: 29, a^(p-1)%p: 1
a: 8, p: 29, a^(p-1)%p: 1
a: 13, p: 29, a^(p-1)%p: 1
a: 18, p: 29, a^(p-1)%p: 1
a: 23, p: 29, a^(p-1)%p: 1
a: 28, p: 29, a^(p-1)%p: 1
'''

C'est vrai. Hmm. La preuve n'est pas mentionnée ici.

Renvoyez l'histoire. Sous cette condition, $ 10 ^ 9 + 7 $ et Y sont toujours premiers l'un par rapport à l'autre, donc l'équation suivante est vraie.

Y^{(10^9+7)-1} \mod 10^9+7 = 1

Divisez les deux côtés par Y $ Y^{(10^9+7)-2} \mod 10^9+7 = {1\over Y} $ Avec ce formulaire, vous pouvez utiliser pow () pour calculer à grande vitesse comme auparavant. Les termes qui apparaissent dans le calcul de combinaison sont séparés en le dénominateur X et la molécule Y, et Y est soumis à ce traitement.

m = 1000000007
n, a, b = map(int, input().split())

def comb(n, r, m):
  X, Y = 1, 1
  for i in range(r):
    X *= n-i
    Y *= i+1
    X %= m
    Y %= m
  return int(X * pow(Y, m-2, m))

out = pow(2, n, m) - 1 - comb(n, a, m) - comb(n, b, m)
print(out%m)


Je suis passé par là.

E - Roaming Combien de conditions de pièce une personne dans chacune des n pièces peut-elle déplacer k fois? C'est le problème.

Je ne pouvais pas imaginer comment le résoudre, alors j'ai abandonné.

J'ai vu le commentaire.

Tout d'abord, considérons une combinaison de chambres avec 0 personnes. Supposons que $ m $ de pièces soient vides. Ensuite, la combinaison de la sélection de m pièces parmi les n pièces

_nC_m

Il peut être trouvé par.

À partir de là, considérez la combinaison de pièces dans laquelle le résident d'origine de la chambre m a déménagé. Il y a plusieurs façons de penser, mais la façon la plus simple est de diviser les $ m $ habitants par des murs $ n-m-1 $. Si le résident est 〇 et le mur est |, cela peut être changé en un problème de réflexion sur la combinaison de modèles pour organiser les chaînes de caractères.

Exemple: Comment diviser 5 personnes par 2 murs?

〇〇|〇|〇〇 Vous pouvez faire une combinaison comme celle-ci.

Cet arrangement est

{7! \over 5!2!}=_7C _2

Peut être calculé avec.

L'application de ce calcul à cette situation donne la formule suivante.

{(m +(n-m-1))!\over m!(n-m-1)!}=_{n-1}C _{m}

Par conséquent, la combinaison de $ _nC_m \ times _ {n-1} C _ {m} $ lorsque la salle $ m $ vaut 0 personne peut être obtenue. Vous pouvez additionner en changeant ce $ m $ de 0 à $ k $ (ou $ n-1 $).

De plus, le résultat du calcul de la combinaison peut être utilisé pour le prochain calcul de la combinaison. $ _{n}C _{m+1} = _{n}C _{m} \times {n-m\over m+1} $ $ _{n-1}C _{m+1} = _{n-1}C _{m} \times {n-m-1\over m+1} $ Nous calculerons cela en utilisant également la formule ci-dessus (ci-dessous). $ Y^{(10^9+7)-2} \mod 10^9+7 = {1\over Y} $

C'est pourquoi c'est un exemple de mise en œuvre. J'écris en regardant le code de presque d'autres personnes.

n, k = map(int, input().split())
c1 = 1
c2 = 1
mod = 10**9+7
ans = 0

for i in range(min(n, k+1)):
  ans += c1 * c2
  c1 *= (n-i) * pow(i+1, mod-2, mod)
  c1 %= mod
  c2 *= (n-i-1) * pow(i+1, mod-2, mod)
  c2 %= mod

print(ans%mod)

Ceci est la fin de cet article.

Recommended Posts

Examen du concours AtCoder pour débutants 159, jusqu'à la question E (Python)
Examen du concours AtCoder Beginner Contest 163, jusqu'à la question E (Python)
Examen du concours AtCoder Beginner Contest 164, jusqu'à la question E (Python)
Examen du concours AtCoder Beginner Contest 162, jusqu'à la question E (Python)
Examen du concours AtCoder Beginner Contest 154, jusqu'à la question E (Python)
Examen du concours AtCoder Beginner Contest 153, jusqu'à la question E (Python)
Examen de AtCoder Beginner Contest 160, jusqu'à la question E (Python)
Examen du concours AtCoder Beginner Contest 167, jusqu'à la question E (Python)
Examen du concours AtCoder pour débutants 161, jusqu'à la question E (Python)
Examen du concours AtCoder Beginner Contest 155, jusqu'à la question E (Python)
Examen du concours AtCoder Beginner Contest 156, jusqu'à la question E (Python)
Examen du concours AtCoder Beginner Contest 166, jusqu'à la question E (Python)
Examen du concours AtCoder Beginner Contest 165, jusqu'à la question E (Python)
atcoder Review of Panasonic Programming Contest 2020, jusqu'à la question E (Python)
Examen de atcoder ABC158, jusqu'à la question E (Python)
AtCoder Beginner Contest 102 Revue des questions précédentes
AtCoder Beginner Contest 072 Revue des questions précédentes
AtCoder Beginner Contest 085 Revue des questions précédentes
AtCoder Beginner Contest 113 Revue des questions précédentes
AtCoder Beginner Contest 074 Revue des questions précédentes
AtCoder Beginner Contest 051 Revue des questions précédentes
AtCoder Beginner Contest 127 Revue des questions précédentes
AtCoder Beginner Contest 119 Revue des questions précédentes
AtCoder Beginner Contest 151 Revue des questions précédentes
AtCoder Beginner Contest 075 Revue des questions précédentes
AtCoder Beginner Contest 054 Revue des questions précédentes
AtCoder Beginner Contest 110 Revue des questions précédentes
AtCoder Beginner Contest 117 Revue des questions précédentes
AtCoder Beginner Contest 070 Revue des questions précédentes
AtCoder Beginner Contest 105 Revue des questions précédentes
AtCoder Beginner Contest 112 Revue des questions précédentes
AtCoder Beginner Contest 076 Revue des questions précédentes
AtCoder Beginner Contest 069 Revue des questions précédentes
AtCoder Beginner Contest 056 Revue des questions précédentes
AtCoder Beginner Contest 087 Revue des questions précédentes
AtCoder Beginner Contest 067 Revue des questions précédentes
AtCoder Beginner Contest 093 Revue des questions précédentes
AtCoder Beginner Contest 046 Revue des questions précédentes
AtCoder Beginner Contest 049 Revue des questions précédentes
AtCoder Beginner Contest 081 Revue des questions précédentes
AtCoder Beginner Contest 047 Revue des questions précédentes
AtCoder Beginner Contest 060 Revue des questions précédentes
AtCoder Beginner Contest 057 Revue des questions précédentes
AtCoder Beginner Contest 121 Revue des questions précédentes
AtCoder Beginner Contest 126 Revue des questions précédentes
AtCoder Beginner Contest 103 Revue des questions précédentes
AtCoder Beginner Contest 061 Revue des questions précédentes
AtCoder Beginner Contest 059 Revue des questions précédentes
AtCoder Beginner Contest 044 Revue des questions précédentes
AtCoder Beginner Contest 083 Revue des questions précédentes
AtCoder Beginner Contest 048 Revue des questions précédentes
AtCoder Beginner Contest 124 Revue des questions précédentes
AtCoder Beginner Contest 097 Revue des questions précédentes
AtCoder Beginner Contest 088 Revue des questions précédentes
AtCoder Beginner Contest 092 Revue des questions précédentes
AtCoder Beginner Contest 099 Revue des questions précédentes
AtCoder Beginner Contest 065 Revue des questions précédentes
AtCoder Beginner Contest 053 Revue des questions précédentes
AtCoder Beginner Contest 094 Revue des questions précédentes
AtCoder Beginner Contest 063 Revue des questions précédentes
Concours pour débutants AtCoder: Réponses aux problèmes D Python