不使用结构如何解决此问题? (超过时间限制)

时间:2020-10-06 17:20:09

标签: python arrays queue

最近,我参加了一场针对初中女生的比赛。我遇到了这个问题,并且已经研究了几个星期。这是问题所在:

I。呼吸机出货量

在当地医院,Gabriela跟踪所有呼吸机的发货情况。最近,建立了一个新工厂来生产呼吸机。她知道新工厂的生产几乎是非凡的,因为在某天Di,它生产的呼吸机数量与前K天的产量相同。但是,医院的计算机只能处理小于P(质数)的非负数。 Gabriela知道前K天每一天的产值Di。因此,Gabriela想知道N天后生产了多少个呼吸机。如果此数字大于或等于P,则计算机将显示生产的呼吸机数量的余数除以P。

输入

Line 1: Three space-separated integers N, K, P
Lines 2...K+1: A single integer Di

输出

Line 1: Number of ventilators produced after N days as displayed by the computer

示例输入:

5 2 7
1
3

输出:

6

注意:

2 ≤ N ≤ 1000000
1 ≤ K ≤ N
2 ≤ P ≤ 1000003 (where P is guaranteed to be prime)
1 ≤ Di ≤ P−1

此问题的时限已扩展到2000毫秒。

我尝试了3种不同的方法

这是第一个:

import math

import sys
string=sys.stdin.readline()
string=string.rstrip()
arr=[0]*3
arr=string.split(' ')
n=int(arr[0])
k=int(arr[1])
p=int(arr[2])


mylist=[0]*k
for i in range (k):
  a=int(sys.stdin.readline())
  mylist[i]=a%p

product=math.prod(mylist)
for start in range (n-k):
  smallest=mylist[start%k]
  mylist[start%k]=(product%p)
  product=product*(product%p)
  product=product//smallest
sys.stdout.write (str(mylist[start%k]))

在另一种方法中,我使用了队列:


import math
from collections import deque
import sys
string=sys.stdin.readline()
string=string.rstrip()
arr=[0]*3
arr=string.split(' ')
n=int(arr[0])
k=int(arr[1])
p=int(arr[2])
q=deque()

for i in range (k):
  a=int(sys.stdin.readline())
  q.append(a%p)

product=math.prod(q)

for i in range (n-k):
  q.append(product%p)
  product=product*(product%p)
  smallest=q.popleft()
  product=product//smallest

sys.stdout.write (str(q.pop())+'\n')

但是,我仍然在试播8上超过时间限制。考虑到时间和空间的限制,我认为我无法使用任何类型的结构(列表,队列等)来解决此问题。有人可以给我一个解决这个问题的想法吗?

1 个答案:

答案 0 :(得分:0)

问题不在于数据结构,而在于算法开销。您的第一次尝试包括一个乘法和每个循环中的五个除法,以及两个列表访问和四个赋值。您的第二次尝试具有三个部门,三个任务和两个列表更改操作。

您可能需要做一些试验,以确定在2秒钟内可以执行多少次操作。您用微不足道的主体运行10 * 6循环迭代需要多长时间?我怀疑您将无法执行迭代解决方案。

而不是单独执行每个迭代计算,请尝试着重解决给定的问题。您不需要需要每天的输出;您只需要计算最后天的输出,以p为模。该生产是输入生产顺序(生产的“种子”天)的高阶产品。那些日子中的每一天出现在该最终产品中多少次?对于大n,值的循环是什么?最重要的是,什么因素使模数残差为1? (无论任何因素都为p-1

计算每个因素在最终产品中出现多少次;称为use。减少该mod p-1。现在您有了一个表达式,例如

product = k[0] ** (use[0] % (p-1) ) *
          k[1] ** (use[1] % (p-1) ) *
          ...

print(product % p)