Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 1, 2013 14:10:51

Arsegg
Зарегистрирован: 2013-05-08
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Задача на Python

Cпасибо всем отписавшимся!

Получил 28 сек (ускорил на 7 сек), заменив все xrange на range + заменил вложенные циклы product'ом + добавил условия в генераторах. Больше скорости я выжать не смог.

from itertools import product
#import time
#import sys
#sys.stdin, sys.stdout = open("aplusb.in", "r"), open("aplusb.out", "w")
#begin = time.time()
MOD = 10**9+7
#c = map(int, raw_input()[::-1])
c = [9]*10000
n = len(c)
r10, rn, r1_n, r2, r1_10 = range(10), range(n), range(1, n), range(2), range(1, 10)
s = [[[[0, 0] for j in r10] for i in r10] for k in rn]
for i in range(c[0]+1):
    s[0][i][c[0]-i][0] = 1
for i in range(c[0]+1, 10):
    s[0][i][10+c[0]-i][1] = 1
for k, i, j, p, p0 in product(r1_n, r10, r10, r2, r2):
    if i+j == c[k]+10*p-p0:
        s[k][i][j][p] = sum(
            s[k-1][x][y][p0]
            for x in r10 if x != i
            for y in r10 if y != j and s[k-1][x][y][p0])%MOD
print sum(s[-1][i][j][0] for i, j in product(r1_10, r1_10) if s[-1][i][j][0])%MOD
#print time.time()-begin

Вариант со смещениями ушел в аут (52 сек) + я его еще коряво реализовал (ответ некорректный выдавал).

Ну придется теперь решать “числодробительные задачи” на c++ Остальные все равно на Python'е буду решать ^^. Очень уж элегантно решения задач выглядят+длинная арифметика и много других вкусняшек из под коробки.

Офлайн

#2 Авг. 1, 2013 15:38:47

bismigalis
Зарегистрирован: 2010-10-02
Сообщения: 449
Репутация: +  47  -
Профиль   Отправить e-mail  

Задача на Python

Arsegg
36(!) с лишним секунд
Arsegg
Нету просто на тестирующей системе этих модулей(

это железка какая-то?

Офлайн

#3 Авг. 1, 2013 18:24:48

Alen
Зарегистрирован: 2013-08-01
Сообщения: 373
Репутация: +  49  -
Профиль   Отправить e-mail  

Задача на Python

c = [9]*10000
n = len(c)

Лишняя операция, итак понятно что n = 10000, меняем:

n = 10000
c = [9]*n

Этот код ничего не делает и загромаждает логику программы:
for i in range(c[0]+1, 10):
    s[0][i][10+c[0]-i][1] = 1

Так как:
c[0] +1 = 10  => range(10, 10) 

for i in range(c[0]+1):
    s[0][i][c[0]-i][0] = 1

Опять лишние вычисления, меняем:

for i in range(10):
    s[0][i][9 - i][0] = 1



Короче тут чистить и чистить.

Отредактировано Alen (Авг. 1, 2013 20:17:33)

Офлайн

#4 Авг. 1, 2013 18:25:59

Singularity
Зарегистрирован: 2011-07-28
Сообщения: 1387
Репутация: +  75  -
Профиль   Отправить e-mail  

Задача на Python

мб pypy ?

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version