最近,我参加了一场针对初中女生的比赛。我遇到了这个问题,并且已经研究了几个星期。这是问题所在:
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上超过时间限制。考虑到时间和空间的限制,我认为我无法使用任何类型的结构(列表,队列等)来解决此问题。有人可以给我一个解决这个问题的想法吗?
答案 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)