Вниз  Разбор интересных задач
- 19.01.2011 / 23:13
XakepPRO
  Пользователь

XakepPRO 
Так самое интересное, это только 9 классу такие задачи, а что с одиннадцатым творится...ужас..
- 20.01.2011 / 08:02
XakepPRO
  Пользователь

XakepPRO 
Еще одна задача, которую я ни как не могу понять:

Найдите произведение всех простых чисел, заключенных между числами 1000000 и 2000000, по модулю 23. Опишите ход решения.

Даю 200 монет. Сделать желательно до 23 января(включительно)
- 20.01.2011 / 13:32
aleksey
  Пользователь

aleksey 
Сейчас: Offline
XakepPRO (20.01.2011/08:02)
по модулю 23
вот это не понятно. Что именн по модулю 23?
- 20.01.2011 / 15:45
Freddy
  Пользователь

Freddy 
Сейчас: Offline
XakepPRO (20.01.2011/08:02)
Еще одна задача, которую я ни как не могу понять:Найдите произведение всех простых чисел, заключенных между числами 1000000 и 2000000, по модулю 23. Опишите ход решения.Даю 200 монет. Сделать желатель
Это значит, что в ответе получится (произведение mod 23). Проблема в том, что произведение получается гигантским и никакой тип данных не вместит такое число, поэтому нужно использовать следующее свойство: модуль произведения равен модулю произведения модулей каждого множителя, т. е. если а*b=c, то ((а mod 23)*(b mod 23) mod 23) = c mod 23
Ищем первое простое число, считаем его модуль по 23, ищем следующее простое число, считаем его модуль, перемножаем с предыдущим, считаем модуль этого произведения, берё следующее простое число и т. д.

Изменено Freddy (20.01 / 15:46) (всего 1 раз)
- 20.01.2011 / 16:02
Freddy
  Пользователь

Freddy 
Сейчас: Offline
XakepPRO, насчёт третьей задачи, пусть массив PI содержит все 1415 чисел, создаём двумерный массив-счётчик counter размером 10х10, в котором строки равны значению разряда десяток в паре чисел, а столбцы - значению едениц, заполняем его в следующем цикле:
  1. for (int i=0;i<PI.length-1;i++)
  2. counter[PI[i]][PI[i+1]]++;
Потом находим наибольшее значение в массиве counter и смотрим индексы этого элемента.
- 20.01.2011 / 19:18
XakepPRO
  Пользователь

XakepPRO 
4-ая задача. Найдите произведение всех простых чисел, заключенных между числами 1000000 и 2000000, по модулю 23. Опишите ход решения.


Смотрим суда: http://ru.wikipedia.org/wiki/Первообразный_корень_(теория_чисел)

И понимаем, что нужно сначала найти все простые числа от 1.000.000 до 2.000.000. Эти числа должны быть "первозданным корнем" по модулю 23.

Проверим, является ли данное простое число первообразным корнем по модулю 23. Если это так, то каждое число от 1 до 22 должно быть представлено остатком от деления некоторой степени данного простого числа на 23, действительно, перебором убеждаемся:
Возьмём пример числа 3 по модулю 7:

3^0 mod 7 = 1
3^1 mod 7 = 3
3^2 mod 7 = 2
3^3 mod 7 = 6
3^4 mod 7 = 4
3^5 mod 7 = 5
---
3^6 mod 7 = 1
3^7 mod 7 = 3
3^8 mod 7 = 2
итп...

Т.е. идёт повторение. Немного поразмыслив, я подумал, а какие корни идут по определённым модулям? как оказалось такие:

По модулю 2: 1, По модулю 3: 2, По модулю 4: 3, По модулю 5: 2, По модулю 6: 5, По модулю 7: 3, 0, 2, 3, 2, 0, 2, 3, 0, 0, 3, 5, 2, 0, 0, 7, 5, 0, 2, 7, 2, 0, 2, 0, 3, 0, 0, 3, 0, 0, 2, 3, 0, 0, 6, 0, 3, 0, 0, 5, 5, 0, 3, 3, 0, 0, 2, 5, 0, 0, 0, 3, 2, 0, 2, 3, 0, 0, 0, 0, 2, 0, 0, 0, 7, 0, 5, 5, 0, 0, 0, 0, 3, 0, 2, 7, 2, 0, 0, 3, 0, 0, 3, 0, 0, 0, 0, 5, 0, 0, 5, 3, 0, 0

Т.е., то что я предлагал искать - бессмысленно.

Изменено XakepPRO (20.01 / 19:19) (всего 1 раз)
- 20.01.2011 / 19:24
XakepPRO
  Пользователь

XakepPRO 
Так, теперь то, что я писал выше надо забыть, и обратиться к посту Freddy, ибо его идея прекрасна. Спасибо тебе, Freddy :-D . Решил посмотреть, что в это время делают конкуренты: на форумах по программированию сидят, и не знают, что делать. Другие программисты говорят, что ничем не могут помочь, ибо даже не могут понять условие. :lol:
- 20.01.2011 / 19:54
XakepPRO
  Пользователь

XakepPRO 
И так. Вот поиск простых чисел+произведение:

  1. var a,b : word;
  2.    i :integer;
  3.    c:real;
  4. begin
  5.  c:=1;
  6.  writeln;
  7.  for i:=1000000 to 2000000 do
  8.  begin
  9.   a:=2;
  10.   b:=round(sqrt(i));
  11.   while (i mod a <> 0) and (a <= b) do inc( a );
  12.   if (a > b) then
  13.   begin
  14.      write( i,' ' );
  15.      c:=c*(i mod 23);
  16.      writeln(c,' ');
  17.   end;
  18.  end;
  19. end.

Читать его трудно, но для олимпиады оно не важно (пусть считают, что это декомпилированные исходники :-D).

Мне очень понравился результат при i=1004119
  1. i=1004119  c=4.00103201162512E+305
  2. i=1004137  c=1.20030960348754E+306
  3. i=1004141  c=8.40216722441276E+306
  4. i=1004161  c=3.3608668897651E+307
  5. i=1004167  c=бесконечность
  6. i=1004209  c=бесконечность 

Хотя тип переменной C - вещественный (real).
Самое маленькое положительное число типа real приблизительно равно 5.0*10^(-324), а самое большое: 1.79769313486232E+308. Вот так вот). Но на олимпиаду требуется только объяснение.

Изменено XakepPRO (20.01 / 19:55) (всего 3 раза)
- 20.01.2011 / 20:27
Freddy
  Пользователь

Freddy 
Сейчас: Offline
XakepPRO, В ответе должно получиться целое число из отрезка [0;22], если первый множитель по модулю даёт 10, а второй даёт 3, то их произведение равно не 30, а (30 mod 23) = 7.

Изменено Freddy (20.01 / 20:29) (всего 1 раз)
- 20.01.2011 / 20:32
XakepPRO
  Пользователь

XakepPRO 
Freddy (20.01.2011/16:02)
XakepPRO, насчёт третьей задачи, пусть массив PI содержит все 1415 чисел, создаём двумерный массив-счётчик counter размером 10х10, в котором строки равны значению разряда десяток в паре чисел, а стол
Сколько раз встречается эта пара?
Наверх  Всего сообщений: 751
Фильтровать сообщения
Поиск по теме
Файлы топика (34)