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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.12.2016, 18:19   #1
dimon_snake
Форумчанин
 
Регистрация: 05.11.2015
Сообщений: 167
По умолчанию Длинные числа

Здравствуйте, нужна ваша помощь.
Есть выражение типа 1^n+2^n+3^n+4^n. Нужно посчитать кол-во нулей в конце этого числа. При этом 0<=n<=1000.
Здесь обязательно использовать длинные числа, или кол-во нулей в конце можно узнать и без них? Ведь 2^1000 это уже около 300 символов, а там еще 3 и 4. Заранее спасибо.
dimon_snake вне форума Ответить с цитированием
Старый 18.12.2016, 19:01   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Здесь показано, что только для n=1, 2 и 3 делится на 5, что равносильно тому, что заканчивается на 0 (поскольку четная сумма). Надо полагать 1 ноль для n=1 и 2. И два нуля для n=3 --> длиной арифметики не надо. Но попробуй )
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 18.12.2016, 19:48   #3
Dekay
Пользователь
 
Регистрация: 21.06.2016
Сообщений: 65
По умолчанию

о! Красота
На самом деле все ооочень просто

1+3^n+2^n(2^n+1) = const*10^k = const*2^k*5^k
Давай посчитаем двойки.
И тут все зависит от 3^n+1 ради прикола выпишем первые пять значений и посчитаем там количество двоек. Их, как оказывается, или 1 или 2. И значения чередуются.
Значит ответ или 1 или 2 илил 0.
Разбираемся с пятерками. Можно снова что-нить найти, но зачем? Если можно просто насчитать эту сумму по модулю 100, 10, 1? Вот и все.

Длинка, для проверки
И само решение
Код:
int pow(int a, int p, int mod) {
    if (p == 0) return 1;
    if (p%2 == 0) return pow(a*a%mod, p/2, mod);
    else return a*pow(a, p-1, mod)%mod;
}

bool ch(int n, int k) {
    return ((1+pow(2, n, k)+pow(3, n, k)+pow(4, n, k))%k == 0);
}

int main() {
    // freopen("input.txt", "r", stdin);
    forn(n, 1001) {
        int k = 10000;
        bool f = false;
        for(int i = 5; i >= 0; i--, k/=10){
            if (ch(n, k)) {
                cout << i-1 << " ";
                f = true;
                break;
            }
        }
        if (!f)
        cout << 0 << " ";
    }
    return 0;
}

Нужно больше задач! Боооольше!
Dekay вне форума Ответить с цитированием
Старый 18.12.2016, 21:09   #4
Plague
Забанен
Форумчанин Подтвердите свой е-майл
 
Аватар для Plague
 
Регистрация: 01.11.2006
Сообщений: 420
По умолчанию

Код:
var n, a:integer;
begin
  readln(n);
  if n mod 20 = 5 then a:=1 else a:=0;
  n:=n mod 4;
  writeln(n div 2 mod 2 + n mod 2 + a);
end.
Если ничто другое не помогает, прочтите, наконец, инструкцию! Аксиома Кана

Последний раз редактировалось Plague; 18.12.2016 в 22:02.
Plague вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Длинные числа. Сравнение >, < Sonny01 Помощь студентам 2 15.12.2014 23:58
Длинные числа. makaroshka_1 Паскаль, Turbo Pascal, PascalABC.NET 0 23.12.2013 21:58
Длинные числа alizon09 Фриланс 1 09.02.2013 12:45
Вычесления НОД (длинные числа) n3250sasha C++ Builder 0 21.12.2011 16:39
длинные числа molodzo Общие вопросы C/C++ 4 21.02.2008 12:46