Одно нульовий дивіденд


28

Опис виклику

Для кожного натурального цілого числа nіснує число, яке має вигляд, 111...10...000що ділиться, nтобто десятковим числом, яке починається з усіх 1's і закінчується з 0' 's' '. Це дуже просто довести: якщо ми візьмемо набір n+1різних чисел у вигляді 111...111(усіх 1), то принаймні два з них дадуть однаковий залишок після ділення на n(за принципом голубої дуги). Різниця цих двох чисел поділяється на nі матиме бажану форму. Ваша мета - написати програму, яка знайде це число.

Опис вводу

Позитивне ціле число.

Опис виводу

Число pу вигляді 111...10...000, таке, що p ≡ 0 (mod n). Якщо ви знайшли більше одного - покажіть будь-яку з них (не потрібно бути найменшою).

Примітки

Ваша програма повинна дати відповідь за розумну кількість часу. Що означає, що жорстоке насильство не дозволено:

p = 0
while (p != 11..10.00 and p % n != 0)
    p++

Ні це:

do
    p = random_int()
while (p != 11..10.00 and p % n != 0)

Ітерація через числа у формі 11..10..00дозволена.

Вашій програмі не потрібно обробляти довільно великий вхід - верхня межа є будь-якою верхньою межею вашої мови.

Зразки виходів

2: 10
3: 1110
12: 11100
49: 1111111111111111111111111111111111111111110
102: 1111111111111111111111111111111111111111111111110

Чи можемо ми мати розумну верхню межу можливого результату? (Щось приблизно менше 2,4 мільярда (приблизно максимальне значення підписаного цілого числа) має бути добре, оскільки для деяких реалізацій можуть знадобитися масиви чи списки)
Tamoghna Chowdhury,

@ MartinBüttner Я думаю, що першого задоволення результатів повинно бути достатньо (розумне обмеження у часових рамках)
Tamoghna Chowdhury

Останній 0 не потрібен у 49 тестових випадках.
CalculatorFeline

@CatsAreFluffy Я думаю, що всі числа повинні містити принаймні 1і хоча б одне 0, інакше 0це рішення для будь-якого введення. (Було б добре уточнити це.)
Мартін Ендер,

Тільки вимагаючи цього, 1слід працювати.
CalculatorFeline

Відповіді:


22

Математика, 29 байт

⌊10^(9EulerPhi@#)/9⌋10^#&

Код Мартіна Бюттнера .

На вході n, це виводить число з 9*ϕ(n)них слідують nнулі, де ϕє функцію Ейлера . За допомогою функції phiце може бути виражено в Python як

lambda n:'1'*9*phi(n)+'0'*n

Достатньо було б використовувати факториал n!замість ϕ(n), але друкувати, що багато хто не має розумного часу роботи.

Твердження: 9*ϕ(n) ті, за якими слідує nнуль, є кратним числом n.

Доказ: По- перше, давайте доведемо це для випадку, nне є кратним 2, 3або 5. Ми покажемо, число, що складається з ϕ(n)одиниць, є кратним `n.

Кількість з kних дорівнює (10^k-1)/9. Оскільки nне є кратним 3, це кратне значення n, скільки 10^k-1є фактором n, або рівнозначним, якщо 10^k = 1 (mod n). Зауважимо, що ця формулювання очевидно, що якщо kпрацює для кількості одиниць, то це робить і будь-який кратний k.

Таким чином, ми шукаємо kбути кратна порядку з kв мультиплікативної групі по модулю п . За теоремою Лагранжа , будь-який подібний порядок є дільником розміру групи. Оскільки елементами групи є число від 1до, nяке є відносно простим n, його розмір є функцією Ейлера, що стосується сили ϕ(n) . Отже, ми показали, що 10^ϕ(n) = 1 (mod n)і тому число, складене з ϕ(n)них, кратне `n.

Тепер давайте розберемося з потенційними чинниками 3в n. Ми знаємо, що 10^ϕ(n)-1це кратний n, але (10^ϕ(n)-1)/9може бути і не. Але, (10^(9*ϕ(n))-1)/9є кратним, 9тому що він складається з 9*ϕ(n)одиниць, тому сума його цифр кратна 9. І ми зазначали, що множення показника kна постійну зберігає подільність.

Тепер, якщо nє фактори 2's і 5', нам потрібно додати нулі до кінця виводу. Це набагато більше, ніж достатньо використовувати nнулі (насправді це log_2(n)було б можливо). Отже, якщо наш вклад nрозбито як n = 2^a * 5^b * m, достатньо, щоб вони 9*ϕ(m)були кратними n, помноженими на 10^nкратні 2^a * 5^b. І, оскільки nце множина m, достатньо їх використовувати 9*ϕ(n). Отже, працює так, щоб 9*ϕ(n)вони мали nнулі.


12
Просто для того, щоб ніхто не думав, що це було розміщено без мого дозволу: xnor придумав метод і доказ все самостійно, і я просто поставив йому реалізацію Mathematica, оскільки вона має вбудовану EulerPhiфункцію. В реальному здійсненні немає нічого розумного, тому я вважаю це повністю своєю роботою.
Мартін Ендер

9

Python 2, 44 байти

f=lambda n,j=1:j/9*j*(j/9*j%n<1)or f(n,j*10)

Коли jпотужність 10, наприклад 1000, поділ підлоги j/9дає число, яке складається з 1, як 111. Отже, j/9*jдає 1, а потім рівне число 0, як 111000.

Функція рекурсивно випробовує числа цієї форми, намагаючись вищі та більші потужності 10, поки не знайдемо той, що кратний бажаному числу.


1
О, хороший пункт, нам потрібно лише перевірити 1 ^ n0 ^ n ...
Мартін Ендер

@ MartinBüttner Якщо це простіше, також достатньо зафіксувати число 0 вхідним значенням. Не знаю, чи вважається це ефективним надрукувати стільки нулів, хоча.
xnor

Чому перевірка 1 ^ n0 ^ n працює?
Лінн

5
@Lynn Додавання більше нулів не може зашкодити, і існує нескінченна кількість можливих цифр одиниць, якесь число буде достатньо і одиниць, і нулів.
xnor

5

Pyth, 11 байт

.W%HQsjZ`TT

Тестовий набір

В основному, він просто ставить 1 попереду і 0 знову і знову, поки число не поділяється на вхід.

Пояснення:

.W%HQsjZ`TT
                Implicit: Q = eval(input()), T = 10
.W              while loop:
  %HQ           while the current value mod Q is not zero
      jZ`T      Join the string "10" with the current value as the separator.
     s          Convert that to an integer.
          T     Starting value 10.

4

Haskell, 51 байт

\k->[b|a<-[1..],b<-[div(10^a)9*10^a],b`mod`k<1]!!0

Використання підходу xnor. німі зберегла байт!


3

CJam, 28 25 19 байт

Збережено 6 байт із зауваженням xnor, що нам потрібно лише переглянути цифри форми .1n0n

ri:X,:)Asfe*{iX%!}=

Перевірте це тут.

Пояснення

ri:X    e# Read input, convert to integer, store in X.
,:)     e# Get range [1 ... X].
As      e# Push "10". 
fe*     e# For each N in the range, repeat the characters in "10" that many times,
        e# so we get ["10" "1100" "111000" ...].
{iX%!}= e# Select the first element from the list which is divided by X.

2

Математика, 140 55 байт

NestWhile["1"<>#<>"0"&,"1",FromDigits@#~Mod~x>0&/.x->#]

Багато байтів видалено завдяки хитрії xnor 1 ^ n0 ^ n.

Мінімальне значення - 140 156 байт. Це дає найменше можливе рішення.

NestWhile["1"<>#&,ToString[10^(Length@NestWhileList[If[EvenQ@#,If[10~Mod~#>0,#/2,#/10],#/5]&,#,Divisors@#~ContainsAny~{2, 5}&],FromDigits@#~Mod~m>0&/.m->#]&

Він обчислює, скільки нулів потрібно, потім перевіряє всі можливі 1підрахунки, поки він не працює. Він може вивести число без 0, але це можна виправити, додавши <>"0"праворуч до фіналу &.


2

Хаскелл, 37 байт

f n=[d|d<-"10",i<-[1..n*9],gcd n i<2]

Для цього використовується той факт, що він працює, щоб мати 9*phi(n)такі, де phiфункція туйєнта Ейлера. Тут він реалізований за допомогою gcdта фільтрації, створюючи одну цифру для кожного значення, iяке є відносно престижним до того, яке знаходиться в діапазоні 1та 9*n. Також достатньо використовувати це багато нулів.


2

JavaScript (ES6), 65 байт

Відредагуйте 2 байти, збережені thx @Neil

Він працює в межах цифрового типу javascript, має 17 значущих цифр. (Так досить обмежено)

a=>{for(n='';!(m=n+=1)[17];)for(;!(m+=0)[17];)if(!(m%a))return+m}  

Менше гольфу

function (a) {
    for (n = ''; !(m = n += '1')[17]; )
        for (; !(m += '0')[17]; )
            if (!(m % a))
                 return +m;
}

1
Чому ні for(m=n;?
Ніл

@Neil, тому що мені потрібно хоча б один нуль. Можливо, я можу знайти коротший шлях ... (thx для редагування)
edc65

О, це було не ясно в питанні, але я бачу, що вибіркові результати мають принаймні один нуль. У цьому випадку ви можете зберегти байт за допомогою for(m=n;!m[16];)if(!((m+=0)%a)).
Ніл

1
@Neil або навіть 2 байти. Thx
edc65

1

Perl 5, 26 байт

включає байт для -n( -M5.01безкоштовно)

($.="1$.0")%$_?redo:say$.


0

bc, 58 байт

define f(n){for(x=1;m=10^x/9*10^x;++x)if(m%n==0)return m;}

Зразкові результати

200: 111000
201: 111111111111111111111111111111111000000000000000000000000000000000
202: 11110000
203: 111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000
204: 111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000
205: 1111100000
206: 11111111111111111111111111111111110000000000000000000000000000000000
207: 111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
208: 111111000000
209: 111111111111111111000000000000000000
210: 111111000000
211: 111111111111111111111111111111000000000000000000000000000000
212: 11111111111110000000000000
213: 111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
214: 1111111111111111111111111111111111111111111111111111100000000000000000000000000000000000000000000000000000
215: 111111111111111111111000000000000000000000
216: 111111111111111111111111111000000000000000000000000000
217: 111111111111111111111111111111000000000000000000000000000000
218: 111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
219: 111111111111111111111111000000000000000000000000

0

постійного струму, 27 байт

Odsm[O*lmdO*sm+O*dln%0<f]sf

Це визначає функцію, fяка очікує її аргументу у змінній n. Щоб використовувати його як програму, ?sn lfx pчитати зі stdin, викликати функцію та друкувати результат у stdout. Змінна mта вершина стека повинні бути скинуті до 10 (повторенням Odsm), перш ніж їх fможна буде повторно використовувати.

Результати:

200: 111000
201: 111111111111111111111111111111111000000000000000000000000000000000
202: 11110000
203: 111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000
204: 111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000
205: 1111100000
206: 11111111111111111111111111111111110000000000000000000000000000000000
207: 111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
208: 111111000000
209: 111111111111111111000000000000000000
210: 111111000000
211: 111111111111111111111111111111000000000000000000000000000000
212: 11111111111110000000000000
213: 111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
214: 1111111111111111111111111111111111111111111111111111100000000000000000000000000000000000000000000000000000
215: 111111111111111111111000000000000000000000
216: 111111111111111111111111111000000000000000000000000000
217: 111111111111111111111111111111000000000000000000000000000000
218: 111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
219: 111111111111111111111111000000000000000000000000
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.