Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.12.23;
Скачать: [xml.tar.bz2];

Вниз

К- ричные числа.   Найти похожие ветки 

 
Armageddon   (2002-12-10 22:22) [0]

Дорогие господа программисты. Предлагаю вашему вниманию еще одну задачу.
Требуется вычислить количество N значных чисел в системе счисления с основанием K таких, что их запись не содержит двух подряд идущих нулей. Ограничения 2<=K<=10; N>=2; 4<=N+K<=180(!!!).


Когда-то я очень долго бился над задачей, недавно попалась на глаза. Помогите пожайлуста. Только не предлагайте, пожалуйста, способов типа "заносим в массив и просто проверяем нет ли в нем двух подряд идущих нулей". Необходим действительно рациональный и быстрый алгоритм. Буду очень презнателен.


 
Uncle Archi   (2002-12-10 22:34) [1]

Это нечестно! Решать задачи с Timus"a при помощи других!
(Задача № 1009 ссылка:
http://acm.timus.ru/problem.asp?id=1009&rus )


 
Armageddon   (2002-12-10 23:00) [2]

Между прочем эта задача была придложена в прошлом году на областной олимпиаде. А что точно такую задачу предложил кто-то еще я не виноват.


 
Uncle Archi   (2002-12-12 12:27) [3]

Зайди на
acm.timus.ru


 
DarkGreen   (2002-12-12 16:11) [4]

Страно, у меня получилась следующаая формула (если я правильно понял условия задачи) Result := K^n-K^(n-1)-(n-2)*(K-1), написал программульку бытренько, отправли ее на acm.timus.ru, а мне говорят, что решение неверное. Вот мое решение:

program K_N;
function Ex(K1, N1: Integer): Longint;
var
I: Integer;
Res: Longint;
begin
Res := K1;
for I := 1 to N1 - 1 do
begin
Res := Res * K1;
end;
Ex := Res;
end;
var
K, N: Integer;
Result: Longint;
begin
ReadLn(N, K);
Result := Ex(K, N)-Ex(K, N-1)-(N-2)*(K-1);
WriteLn(Result);
end.


 
DarkGreen   (2002-12-12 16:13) [5]

Дополнение:
После компиляции размер exe"шника составил ~9Кб, а в статиске мне сказали, что количество используемой памяти = 390 Кб, что-то у них там не так работает. Иль я в чем не прав?


 
Uncle Archi   (2002-12-12 21:25) [6]

>После компиляции размер exe"шника составил ~9Кб, а в статиске >мне сказали, что количество используемой памяти = 390 Кб,
>что-то у них там не так работает. Иль я в чем не прав?

Память даётся та, которую занимают переменные, а не exe"шник

>отправли ее на acm.timus.ru, а мне говорят, что решение
>неверное

Значит не решил


 
DarkGreen   (2002-12-13 05:43) [7]

2 Uncle Archi ©: И где ты там увидел 390Кб переменных??? Программа в 100000 на паскале имеет сегмент данных ~64Кб. А у данной программы Data Size = 756 Code Size = 2829 Stack Size = 16384 (Borland Pascal 7.0)

> Значит не решил

Веский аргумент. Ты хотя бы решение глянул?


 
Separator   (2002-12-13 06:16) [8]


> DarkGreen © (13.12.02 05:43)

Ты наверное писал на Borland Pascal а они компилируют на дельфях, отсюда и больше памяти. Я тоже несколькими способами решал эту задачу, но то ответ не верен, то времени слишком много затрачивается на решение :-)


 
DarkGreen   (2002-12-13 06:35) [9]

2 Separator ©:
Ну в этом случае, они конкретные уроды, указывают Паскаль, а компилят делфями, при чем даже компилируя делфями размер программы не может быть 390Кб. :(. Да, на счет этой задачи, как я понял, необходимо исключить из общего количества N-значных чисел, те, которые внутри себя содержат два подряд идущих нуля, а вот что делать, если число подряд идущих нулей > 2, в условии про это ни чего не говорится, и я такие числа не удалял, правильно ли это?


 
Separator   (2002-12-13 06:48) [10]

нет, если больше, то они тоже долны удалятся. Вот рабочий пример, но в acm.timus он не проходит по времени:

function ExStr(N, K: integer): integer; //Для проверки значений

function Proverka(S: string): boolean;
var
i: integer;

begin
Result:= true;
for i:= 2 to Length(S) - 1 do
if (S[i] = "0") and (S[i + 1] = "0") then
begin
Result:= false;
Break
end
end;

var
J: integer;

procedure Work(Level: integer; S: string);
var
i: integer;

begin
if Level = 1 then
for i:= 1 to K - 1 do
Work(Level + 1, IntToStr(i))
else
if Level <> N then
for i:= 0 to K - 1 do
Work(Level + 1, S + IntToStr(i))
else
for i:= 0 to K - 1 do
if Proverka(S + IntToStr(i)) then
Inc(J)
end;


Самый примитивный метод решения задачи, кстати я тоже делал примерно также как и ты, только там формула попроще:

function Ex(N, K: integer): integer;
begin
Result:= trunc(exp(N * ln(K)) - exp((N - 1) * Ln(K)) - (N - 2) * (K - 1))
end;


Но результат не верен, если брать допусти N = 5 и K = 10


 
DarkGreen   (2002-12-13 07:10) [11]

2 Separator © (13.12.02 06:48)

Спасибо большое за пояснения.

Этим парням из университета, надо посоветовать научиться ставить условия задачи. Чтобы люди, учавствующие в конкурсе не ломали себе голову над интерпретацией задания.


 
Uncle Archi   (2002-12-13 21:45) [12]

>Ты наверное писал на Borland Pascal а они компилируют на
>дельфях, отсюда и больше памяти. Я тоже несколькими способами >решал эту задачу, но то ответ не верен, то времени слишком
>много затрачивается на решение :-)

Они компилят на хорошем паскале, который позволяет делать большие массивы и использует много памяти.
// если написать Int64-ошибка компиляции



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2002.12.23;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.008 c
8-74856
mand
2002-09-05 21:26
2002.12.23
мультимедиа


7-75005
ThermiT
2002-10-20 09:32
2002.12.23
Программа при загрузке


1-74641
Ag2002
2002-12-10 14:48
2002.12.23
Ожидание


14-74978
3d[Power]
2002-12-03 14:32
2002.12.23
---|Ветка была без названия|---


3-74614
ИгорьК
2002-12-04 17:45
2002.12.23
ADOQuery и несколько параметров с одинаковыми именами





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский