Аня заменила каждое натуральное число от 1 до 100...
作成日: 2026年4月22日
使用モデル GPT-5.4 Thinking by Chat01
作成日: 2026年4月22日
使用モデル GPT-5.4 Thinking by Chat01
Аня заменила каждое натуральное число от 1 до 100 на одну из трех букв
У, Р или А. Докажите, что найдутся две одинаковых буквы такие, что разность
соответствующих им чисел является квадратом натурального числа
pythonimport itertools, math n=100 squares=[i*i for i in range(1,int(math.isqrt(n-1))+1)] adj={i:set() for i in range(1,n+1)} for i in range(1,n+1): for s in squares: if i+s<=n: adj[i].add(i+s); adj[i+s].add(i) # backtracking find chromatic number >3? obviously maybe. order=sorted(range(1,n+1), key=lambda x: len(adj[x]), reverse=True) len(adj[1]), squares[:10], order[:10] (9, [1, 4, 9, 16, 25, 36, 49, 64, 81], [50, 51, 17, 18, 19, 26, 27, 28, 29, 30])
pythonimport networkx as nx, math, itertools, random G=nx.Graph() G.add_nodes_from(range(1,n+1)) for i in range(1,n+1): for j in adj[i]: if i<j: G.add_edge(i,j) # chromatic number lower bound? try algorithm? print(nx.number_of_nodes(G), nx.number_of_edges(G)) # Use approximation? Search cliques print(nx.graph_clique_number(G))
pythonimport itertools, math, networkx as nx n=100 squares=[i*i for i in range(1,int(math.isqrt(n-1))+1)] G=nx.Graph() G.add_nodes_from(range(1,n+1)) for i in range(1,n+1): for s in squares: if i+s<=n: G.add_edge(i,i+s) from networkx.algorithms.clique import find_cliques print(max(len(c) for c in find_cliques(G)))
pythonimport math,itertools,random n=100 squares=[i*i for i in range(1,int(math.isqrt(n-1))+1)] adj={i:set() for i in range(1,n+1)} for i in range(1,n+1): for s in squares: if i+s<=n: adj[i].add(i+s); adj[i+s].add(i) def can3(vertices): verts=sorted(vertices, key=lambda x: len(adj[x]&vertices), reverse=True) colors={} def bt(idx): if idx==len(verts): return True v=verts[idx] used={colors[u] for u in adj[v] if u in colors} for c in range(3): if c not in used: colors[v]=c if bt(idx+1): return True del colors[v] return False return bt(0) V=set(range(1,101)) print(can3(V))
pythonimport math, random n=100 squares=[i*i for i in range(1,int(math.isqrt(n-1))+1)] adj={i:set() for i in range(1,n+1)} for i in range(1,n+1): for s in squares: if i+s<=n: adj[i].add(i+s); adj[i+s].add(i) def can3(vertices): vertices=set(vertices) verts=sorted(vertices, key=lambda x: len(adj[x]&vertices), reverse=True) colors={} def bt(idx): if idx==len(verts): return True # choose uncolored with saturation maybe best=None; bestkey=None for v in verts: if v not in colors: used={colors[u] for u in adj[v] if u in colors} key=(len(used), len(adj[v]&vertices)) if best is None or key>bestkey: best=v; bestkey=key v=best used={colors[u] for u in adj[v] if u in colors} for c in range(3): if c not in used: colors[v]=c if bt(idx+1): return True del colors[v] return False return bt(0) V=set(range(1,101)) changed=True while changed: changed=False for v in list(V): if not can3(V-{v}): V.remove(v); changed=True; print("removed",v,"size",len(V)); break print("final size",len(V),sorted(V))
pythonV=[72,74,75,81,83,84,88,90,91,92,97,99,100] for v in V: print(v, sorted(adj[v] & set(V)))
pythonimport itertools, math V=[72,74,75,81,83,84,88,90,91,92,97,99,100] tri=[] for a,b,c in itertools.combinations(V,3): if b in adj[a] and c in adj[a] and c in adj[b]: tri.append((a,b,c)) tri [(72, 81, 97), (72, 88, 97), (74, 83, 99), (74, 90, 99), (75, 84, 100), (75, 91, 100)]
pythonV=set([72,74,75,81,83,84,88,90,91,92,97,99,100]) verts=sorted(V) sol=[] colors={} def bt(): if len(colors)==len(verts): sol.append(colors.copy()); return # choose next with saturation un=[v for v in verts if v not in colors] best=max(un,key=lambda v:(len({colors[u] for u in adj[v] if u in colors}), len(adj[v]&V))) used={colors[u] for u in adj[best] if u in colors} for c in range(3): if c not in used: colors[best]=c bt() del colors[best] bt() len(sol) 0
Предположим противное: Аня раскрасила числа от до буквами У, Р, А так, что никакие два одинаково отмеченных числа не отличаются на квадрат натурального числа.
Рассмотрим только следующие 13 чисел:
Тогда любые два из них, разность которых равна или , должны иметь разные буквы.
Теперь заметим:
образуют тройку, у которой попарные разности равны
то есть все три разности — квадраты. Значит, на числах стоят три разные буквы.
Точно так же тройка
тоже имеет попарные разности , значит, на ней тоже стоят три разные буквы. Поскольку числа и в обеих тройках те же самые, число должно иметь ту же букву, что и .
Итак,
Аналогично, из троек
получаем, что
Из троек
получаем, что
Теперь посмотрим на числа .
Следовательно, числа отмечены тремя разными буквами.
Но имеет ту же букву, что , значит, числа
тоже отмечены тремя разными буквами.
Теперь число отличается от них на квадраты:
Значит, буква на должна отличаться и от буквы на , и от буквы на , и от буквы на . То есть она должна быть отлична сразу от всех трёх букв У, Р, А — невозможно.
Получили противоречие.
Значит, обязательно найдутся два числа с одинаковой буквой, разность которых является квадратом натурального числа.
Что и требовалось доказать.