Madhav Riya’nın Doğum Günü Partisine gitti. O bir inek, bu yüzden hangi hediye hoşuna gideceği konusunda hiçbir fikri yoktu. Bu yüzden bir dizi tamsayıyı yanına aldı. Dizi belirli bir düzene uyuyordu. Dizinin ilk elemanı 1’di. Dizinin ikinci elemanı 6 idi.
Dizinin diğer elemanları, kendisinden önce gelen ve sonrasındaki sayının aritmetik ortalamasının iki eksiği olarak belirleniyordu. Açıkça görüleceği gibi, Riya bu fikrin aptalca olduğunu düşündü ve bu yüzden Madhav’ı cezalandırmak istedi. Madhav’ın bu utanç verici durumdan kaçmasına yardım et.
Girdi
Girdi, T, Test Durumlarının sayısı ile başlar.
Sonraki T satırda tamsayı N bulunur.
Çıktı
Her test durumu için, dizinin N’inci bir tamsayısını çıktı olarak verin. Cevap çok büyük olabileceğinden, sonucu 10 üzeri 9 + 7’e göre modulo alarak çıktı verin.
Kısıtlamalar:
1 ≤ T ≤ 105
1 ≤ N ≤ 1018
Örnek Giriş
2
1
3
Örnek Çıktı
1
15
Kısacası özetlersek [1,6,15,28…] diye giden bir serinin N-1 inci elemanını veren sonuçlar olacak.
Örnek girdide 2 tane isteneceği söyleniyor, sonraki girdiler N. eleman 1 için 1, 3 için 15 değerini döndürüyor.
Buna ilk başta aşağıdaki kodu yazdım mevzuyu anlamak için.
dizi = [1,6]
N = []
T = int(input())
for _ in range(T):
N.append(int(input()))
ma = max(N)
for i in range(2,ma):
dizi.append(2*dizi[i-1]-dizi[i-2]+4)
for i in N:
print(dizi[i-1])
Program doğru sonuçları döndürüyor fakat zaman hızı ve bellek testlerinden geçemedi.
Daha sonra şöyle hızlanır belki diye düşünüp bu kodu yazdım.
def bul(eleman):
if eleman == 1:
return 1
tp=0
for n in range(0,eleman-1):
tp += n
return 1+5*(eleman-1)+4*(tp)
T = int(input())
for _ in range(T):
print(bul(int(input())))
def f(n: int):
return 4 * n + 1 + f(n - 1) if n else 1
for i in range(10):
print(f(i))
Çıktı:
1
6
15
28
45
66
91
120
153
190
Ama, bunu O(1) zaman karmaşıklığı ile yapmak için matematiksel bir formül elde etmek gerekiyor. Biraz üzerinde çalıştım ve sonunda f(x) = 2x2 + 3x + 1 formülünü elde ettim. Bu formülü bir Python fonksiyonuna çevirirsek O(1) hızında bir fonksiyonumuz olur.
def g(n: int):
return 2 * n ** 2 + 3 * n + 1
f ve g fonksiyonlarını aynı anda çalıştırıp, sonuçları karşılaştıralım: