Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.06.2014, 19:10   #1
Nata-95
Пользователь
 
Регистрация: 04.05.2014
Сообщений: 12
Печаль Не проходит до конца на e-olimp

Помогите, пожалуйста, исправить программу

Вам даны целые числа A, B и C. Выведите остаток от деления A^B (A в степени B) на C.

Технические условия
Входные данные
Единственная строка входного файла содержит три целых числа: A, B, C (1 <= A, B, C <= 1018). Числа разделены пробелами.

Выходные данные
Выходной файл должен содержать одно целое неотрицательное число, меньшее C - ответ к задаче.
Код:
#include <iostream>
 
using namespace std;
int main()
{
    int a, b, c,a1;
    cin>>a>>b>>c;
    a1=a;
    for (int i=0;i<b-1;i++)
    {
        a=a*a1;
    }
    cout<<a%c<<endl;
    return 0;
}
Пример входных данных
3 4 5
Пример выходных данных
1

Последний раз редактировалось Stilet; 08.06.2014 в 19:30.
Nata-95 вне форума Ответить с цитированием
Старый 08.06.2014, 19:38   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
cin>>a>>b>>c;
Цитата:
Единственная строка входного файла
Открыть файл забыла. cin действует только с консолью.
И кстати:
Код:
#include <iostream>
#include <fstream>
#include <math.h>
using namespace std;

int main()
{
    ifstream f("d:\\1\\input.txt");
    ofstream o("d:\\1\\output.txt");
    int a,b,c;
    f>>a>>b>>c;
    o << (int)pow(a,b)%c;
    f.close(); o.close();
    return 0;
}
Это мое мнение. Всмысле цикл фтопку.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 08.06.2014, 20:02   #3
Nata-95
Пользователь
 
Регистрация: 04.05.2014
Сообщений: 12
По умолчанию

теперь просто открывается консоль, а при нажатии на клавиши закрывается
Nata-95 вне форума Ответить с цитированием
Старый 08.06.2014, 20:36   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну. А ты чего хочешь?
Читай внимательно условие задачи - у тебя данные не из консоли берутся. И выход тоже не в консоль.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 08.06.2014, 21:04   #5
Nata-95
Пользователь
 
Регистрация: 04.05.2014
Сообщений: 12
По умолчанию

Хорошо, Виталий, спасибо. Не могли бы ли вы мне помочь мне ещё с одной задачей. Она тоже на e-olimp не проходит

Код:
#include <iostream>
#include <cmath>

using namespace std; 
int main()
{
 long a, h, z;
 float tz, tgz, rez;
 
 const float pi = 3.14;
 cin >> a >> h >> z;
 
 tz = z * pi / 180;
 tgz = tan(tz); 
 
 if (z == 90)
     rez = a * h * sqrt(2.0);
 else if (2 * h < a * tgz)
     rez = (pow(a, 2) / 2 - pow(a - h * sqrt(2) / tgz, 2) / 2) / cos(tz);
 else
     rez = pow(a, 2) / 2 / cos(tz);
 
 cout << rez << endl;
 return 0;
}
Вот условие:Готовя обед для Анфисы - символа 2008 года, хозяин использовал для разрезания сыра специальный нож, который разрезал сыр на одинаковые прямоугольные паралелепипеды с основанием в виде квадрата со стороной A и высотой B.

Но Анфиса, как и подобает даме года, любила употреблять сыр несколько меньших размеров, для чего она всегда разрезала предложенный кусочек деликатеса на две части, предварительно установив его строго вертикально квадратом к столу. При разрезании нож всегда размещался по диагонали квадрата, но Анфисе не всегда удавалось разрезать кусочек пополам, так как плоскость лезвия ножа образовывала двугранный угол Z o с плоскостью основания.

Найти площадь S созданного Анфисой сечения.


Технические условия
Вход


Целые числа А, B, Z, не превышающие 90.

Выход

Площадь S образованного сечения с точностью до 3-х знаков после запятой.
Nata-95 вне форума Ответить с цитированием
Старый 08.06.2014, 21:30   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я опять должен догадываться что зашифровано под фразой "тоже на e-olimp не проходит"?
Ладно. Ответ будет тот же:
Цитата:
Открыть файл забыла. cin действует только с консолью.
Аналогия открытия-считывания-записи-закрытия в моем примере есть. Можешь использоват
I'm learning to live...

Последний раз редактировалось Stilet; 08.06.2014 в 21:37.
Stilet вне форума Ответить с цитированием
Старый 09.06.2014, 00:37   #7
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Открыть файл забыла. cin действует только с консолью.
И кстати:
Код:
#include <iostream>
#include <fstream>
#include <math.h>
using namespace std;

int main()
{
    ifstream f("d:\\1\\input.txt");
    ofstream o("d:\\1\\output.txt");
    int a,b,c;
    f>>a>>b>>c;
    o << (int)pow(a,b)%c;
    f.close(); o.close();
    return 0;
}
Это мое мнение. Всмысле цикл фтопку.
Интересно знать, как такой алгоритм сработает для строки: 1018 1018 1017
Carbon вне форума Ответить с цитированием
Старый 09.06.2014, 09:11   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
как такой алгоритм сработает для строки: 1018 1018 1017
Никак )) Процессор не потянет. Тут любой алгоритм кроме длинной арифметики облажается.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.06.2014, 10:26   #9
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Никак )) Процессор не потянет. Тут любой алгоритм кроме длинной арифметики облажается.
Не любой. Я не пользовался длинной арифметикой.
Вот смотри:
Пусть P = kC + m (P делится на C с остатком m) и нужно найти, какой остаток дает PQ на C. (kC + m)Q = kCQ + mQ получается, что PQ mod C = (P mod C)Q (естественно, все числа целые).
Если взять Q = A, P = A^(B - 1), тогда A^B mod C = (A^(B - 1) mod C)A.
Ну и для вычисления результата достаточен простой цикл:
Код:
int result = 1;
for (int i = 0; i < B; ++i) {
    result = (A * result) % C;
}
В принципе, можно еще и сократить:
Код:
int result = 1;
for (int i = 0; i < B; ++i) {
    result = (A * result) % C;
    if (result ==  0) break;
}
Ах да, для огромных A и B для результата нужно использовать long и возводить в степень не циклом по показателю, а каждый раз степень делить на 2 и получится не более 32 итераций.
Carbon вне форума Ответить с цитированием
Старый 09.06.2014, 11:10   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ладно, согласен )
Я не особо сведущ в делах олимпиадных, так что пусть будет по твоему.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача из e-olimp №915 vadimmmm Паскаль, Turbo Pascal, PascalABC.NET 6 16.03.2014 21:18
Задача из e-olimp №76 vadimmmm Паскаль, Turbo Pascal, PascalABC.NET 4 15.03.2014 21:00
Задача из e-olimp №8 vadimmmm Паскаль, Turbo Pascal, PascalABC.NET 3 15.03.2014 17:37
Задача из e-olimp №1622 vadimmmm Паскаль, Turbo Pascal, PascalABC.NET 1 15.03.2014 10:48
бэкап проходит средствами sql но не проходит средствами 1с so1idsnake Помощь студентам 4 16.09.2013 08:44