【发布时间】:2020-10-06 17:20:09
【问题描述】:
最近我参加了一个中学生的比赛。我遇到了这个问题,我已经研究了几个星期。问题来了:
我。呼吸机出货量
在当地医院,Gabriela 跟踪所有呼吸机的发货情况。最近,一家新工厂成立,生产呼吸机。她知道,新工厂的生产几乎非同凡响,迪某天,它生产的呼吸机与前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 上仍然超出了时间限制。鉴于时间和空间的限制,我认为我无法使用任何类型的结构(列表、队列等)来解决这个问题。有人可以告诉我如何解决这个问题吗?
【问题讨论】: