A627. Partitions et concaténations
Q1. Trouver l’entier 𝑛 à 3 chiffres qui est en même temps :
- la somme de deux entiers tels que 𝑛
2s’obtient par concaténation de ces deux entiers
- la somme de trois entiers tels que 𝑛
3s’obtient par concaténation de ces trois entiers dont l’un d’eux s’écrit par convention sous la forme 0𝑥𝑦.
Q2. Trouver tous les entiers 𝑛 à 6 chiffres qui sont la somme de deux entiers à 6 chiffres tels que 𝑛
2s’obtient par concaténation de ces deux entiers.
Pour les plus courageux
q1. Trouver tous les entiers 𝑛 à 4 chiffres qui sont la somme de trois entiers à 4 chiffres tels que 𝑛
3s’obtient par concaténation de ces trois entiers.
q2. Trouver tous les entiers 𝑛 à 3 chiffres qui sont la somme de quatre entiers non nuls tels que 𝑛
4s’obtient par concaténation de ces quatre entiers.
Solution
Proposée par Fabien GIGANTE
Le petit programme C# en page suivante permet de trouver les réponses en quelques centièmes de seconde…
Q1.
𝟐𝟗𝟕=88+209=26+198+073Q2. 318682=101558+217124 ; 329967=108878+221089 ; 351352=123448+227904 ; 356643=127194+229449 ; 390313=152344+237969 ; 461539=213018+248521 ; 466830=217930+248900 ; 499500=249500+250000 ; 500500=250500+250000 ; 533170=284270+248900 ; 538461=289940+248521 ; 609687=371718+237969 ; 643357=413908+229449 ; 648648=420744+227904 ; 670033=448944+221089 ; 681318=464194+217124 ; 791505=626480+165025 ; 812890=660790+152100 ; 818181=669420+148761 ; 851851=725650+126201 ; 857143=734694+122449
q1. 4949=1212+1388+2349 ; 5049=1287+1113+2649 ; 5455=1623+2457+1375 ; 5554=1713+2377+1464 ; 7172=3689+1035+2448
q2. 433=35+152+125+121
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
namespace Diophante {
static class A627 {
static IEnumerable<T> Single<T>(T v) { yield return v; }
static IEnumerable<IEnumerable<T>> WhereAll<T>(this IEnumerable<IEnumerable<T>> e, Func<T, bool> f) => e.Where(l => l.All(f));
static IEnumerable<ulong> Range(ulong a, ulong b) { for (ulong n = a; n <= b; n++) yield return n; } static ulong Sum(this IEnumerable<ulong> e) => e.Aggregate(0UL, (a, b) => a + b);
static bool AnyOfSum(this IEnumerable<IEnumerable<ulong>> e, ulong n) => e.Any(l => l.Sum() == n);
static IEnumerable<IEnumerable<ulong>> WhereSum(this IEnumerable<IEnumerable<ulong>> e, ulong n) => e.Where(l => l.Sum() == n);
static string Format<T>(this IEnumerable<T> e, char c = ' ') => e.Aggregate((string)null, (x, v) => x == null ? $"{v}" : $"{x}{c}{v}");
static string Format(this IEnumerable<IEnumerable<ulong>> e) => e.Select(l => $"{l.Sum()}={l.Format('+')}").Format();
static void FindRange(string s, ulong a, ulong b, Func<ulong, bool> cond)
=> Console.WriteLine(s + Range(a, b).AsParallel().AsOrdered().Where(cond).Format());
static void FindRange(string s, ulong a, ulong b, Func<ulong, IEnumerable<IEnumerable<ulong>>> select) => Console.WriteLine(s + Range(a, b).AsParallel().AsOrdered().SelectMany(select).Format());
static IEnumerable<IEnumerable<ulong>> Split(ulong n, int d, bool pad = false) {
if (d == 1) { yield return Single(n); yield break; }
for (ulong k = 10; n / k > 0; k *= 10) if (pad || k == 10 || n % k >= k / 10)
foreach (var l in Split(n / k, d - 1, pad)) yield return l.Concat(Single(n % k));
}
static void Main() {
Stopwatch w = new Stopwatch(); w.Start();
FindRange("Q1.", 100, 999, n => Split(n * n, 2).AnyOfSum(n) && Split(n * n * n, 3, true).AnyOfSum(n));
FindRange("Q2.", 100000, 999999, n => Split(n * n, 2).WhereAll(i => i >= 100000 && i <= 999999).WhereSum(n));
FindRange("q1.", 1000, 9999, n => Split(n * n * n, 3).WhereAll(i => i >= 1000 && i <= 9999).WhereSum(n));
FindRange("q2.", 100, 999, n => Split(n * n * n * n, 4).WhereAll(i => i > 0).WhereSum(n));
w.Stop(); Console.WriteLine($"Elapsed {w.ElapsedMilliseconds}ms");
} } }