082 20000 nombres
Issu de la 14ème finale internationale FFJM - 1ère
séance Solution 1 Notons
G[m,n] la valeur de la case (ligne m, colonne n).
G[1,1] = 1 , les autres éléments se calculant par récurrence selon le
procédé indiqué.
Considérons la représentation binaires des nombres :
n = SOMME(k=0,1,...){B[n,k]*(2^k)}, B[n,k] étant binaire (0 ou 1).
et le "ou exclusif" vectoriel :
VEOR(m,n) = SOMME(k=0,1,...){beor(B[m,k],B[m,k])*(2^k)} avec {beor(Mk,Nk)=0
si Mk==Nk} et {beor(Mk,Nk)=1 si Mk!=Nk}
Après tout ça on obtient par induction :
G[m,n] = 1 + VEOR(m-1,n-1)
G[100,200] = 1 + VEOR(99,199) = 1 + VEOR['01100011','11000111')= 1 +
'10100100'= 1+164 = 165
GENERALISATION :
Comme Mathias a vraiment du temps à perdre, il est maintenant avec une
grille à N dimensions.
On note G[i[1],i[2],...,i[N]] les valeurs des cases.
G[1,1,...,1] = 1 , les autres cases se calculant de façon analogue au cas
bidimensionnel :
- chaque case contient le plus petit entier strictement positif différent
de tous ceux déjà écrits dans les portions de dimensions aboutissant à
la case. Comme ça fait penser au jargon des juristes, définissons formellement les
éléments de G :
G[1,..,1,..,1] = 1
et par récurrence :
G[i[1],..,i[k],..,i[N]] = = MIN{entiers positifs différents de
UNION(k=1,..,N){UNION(0<=t<i[k]){G[i[1],..,i[k-1],t,i[k+1],..,i[N]}}}
Si tout ce formalisme ne nous a pas détourné de notre but, quelle est la
formule de calcul de G[...] ?
D'après moi on devrait trouver : G[i[1],..,i[k],..,i[N]] = 1 + VEOR(i[1]-1,..,i[k]-1,..,i[N]-1) Solution
2 Si l'on regarde ce qui se passe sur les premières
rangées, on peut faire plusieurs remarques :
- la grille est symétrique par rapport à la première diagonale
- la grille présente une structure répétitive à des échelles plus
grandes.
En particulier, si l'on appelle f(l,c) la valeur de la ligne l et la colonne
c, on a :
- f(1,1)=1
- f(l,c)=f(c,l)
- à l'aide de cette dernière relation, on se ramène au cas où c <= l
pour l,r > 1, on pose s = max { r \ 2^r < l}
si 2^s < r <= 2^(s+1), alors f(l,r)=f(l-2^s,r-2^s)
si r <= 2^s, alors f(l,r)=f(l-2^s,r)+2^s
Ainsi cherchant f(200,100), on a f(200,100)
=f(200-128,100)+128=128+f(72,100)
=128+f(100,72)=128+f(100-64,72-64)=128+f(36,8)
=128+f(36-32,8)+32=160+f(4,8)
=160+f(8,4)=160+f(8-4,4)+4
=164+f(4,4)=164+f(2,2)=164+f(1,1)
=165 |
Cliquez pour agrandir |