Модераторы: Alx, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Задача про НОД, TopCoder SRM 401 div 2 (250) 
:(
    Опции темы
Kakadu
  Дата 9.5.2008, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 273
Регистрация: 19.3.2008

Репутация: нет
Всего: 7



Английский текст приводить не буду, а сразу переведу на русский.
Отрезок начинается и заканчивается в точках  с целыми координатами ("целые" точки). Посчитать через сколько целых точек он проходит (начало и конец не считаем).

Method signature:  int carrotsBetweenCarrots(int x1, int y1, int x2, int y2)

Код

#include <iostream>

using namespace std;

class DreamingAboutCarrots {
public:
    int carrotsBetweenCarrots(int, int, int, int);
};

int DreamingAboutCarrots::carrotsBetweenCarrots(int x1, int y1, int x2, int y2) {

    long double a=abs(x1-x2), b=abs(y1-y2), h = b/a, curY = 0;
    int ans = 0;
//    cout << "h= " << h << "\n";
    for (int i=+1; i<a; ++i) {
       curY=curY+h;
//       cout << "i= " << i << "; curY= " << curY << "\n";
       if (abs(curY - (int)curY)<0.0000000001) ++ans;
    }
    return ans;
}

Вот это не работает. Не хватает видимо точности.

Правильное решение: НОД катетов минус 1. Почему это так?? я не понимаю!!   smile 


--------------------
Добрые мариносы долго кормили украдкой маленьких зерлингов. От этой украдки зерлинги пухли и дохли
PM MAIL   Вверх
maxim1000
Дата 9.5.2008, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 2
Всего: 110



тут можно решать в два этапа:
1. найти НОД-1 точек
2. доказать, что больше нету

A, B - концы отрезка
dx=Bx-Ax
dy=By-Ay

первый этап очень простой:
dx (горизонтальный катет) = N*НОД
dy (вертикальный катет) = M*НОД
тогда мы можем просто выписать НОД-1 точку (учитывая, что концы нас не интересуют):
(1*N,1*M),(2*N,2*M),...,((НОД-1)*N,(НОД-1)*M)

теперь второй этап:
просто докажем, что если взять любую точку с целыми координатами на отрезке, она будет одной из вышеупомянутой последовательности
взяли точку C
тогда (Cx-Ax)/dx=(Cy-Ay)/dy
dy*(Cx-Ax)=dx*(Cy-Ay)
M*(Cx-Ax)=N*(Cy-Ay)
т.к. Cy-Ay - целое, то M*(Cx-Ax) кратно N
а т.к. M и N взаимно простые, то Cx-Ax кратно N
аналогично Cy-Ay кратно M
т.е. Cx-Ax=K*N, Cy-Ay=L*M
K*N/(N*НОД)=L*M/(M*НОД)
сокращаем: K=L
т.е. Cx-Ax=K*N, Cy-Ay=K*M
это K не может быть меньше 0 или больше НОД, т.к. точка вылезет за пределы отрезка
и равна она быть тоже не может, т.к. концы отрезка нас не интересуют
значит K - целое в пределах [1,...,НОД-1]

P.S.
что-то, чувствую, немного кривоватое доказательство - в смысле можно короче


--------------------
qqq
PM WWW   Вверх
Kakadu
Дата 10.5.2008, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 273
Регистрация: 19.3.2008

Репутация: нет
Всего: 7



Ошибки никак найти не могу. Видимо это победа
спасибо


--------------------
Добрые мариносы долго кормили украдкой маленьких зерлингов. От этой украдки зерлинги пухли и дохли
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Интересные и занимательные задачи по программированию | Следующая тема »


 




[ Время генерации скрипта: 0.0419 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.