1656 - Unu Zero
Se consideră un şir format din N+2
cifre binare, care conţine cel puţin o cifră 1
şi cel puţin trei cifre 0
; prima şi ultima cifră a şirului sunt 0
.
Numim 1-secvenţă
o succesiune formată numai din cifre 1
, aflate pe poziţii consecutive în acest şir, delimitată de câte o cifră 0
.
Corina construieşte un astfel de şir, în care numărul de cifre 1
ale fiecărei 1-secvenţe
să fie cuprins între două numere naturale date, p
şi q
(p ≤ q
).
Cerința[edit | edit source]
Scrieţi un program care să determine un număr natural K
, egal cu restul împărţirii la 666013
a numărului de şiruri distincte, de tipul celui construit de Corina.
Date de intrare[edit | edit source]
Fişierul de intrare input.txt
conţine pe prima linie numărul natural N
, iar pe cea de a doua linie numerele naturale p
şi q
( p ≤ q
), separate printr-un spaţiu.
Date de ieșire[edit | edit source]
Fişierul de ieşire output.txt
va conţine pe prima linie numărul natural K
cerut.
Restricții și precizări[edit | edit source]
1 ≤ p ≤ q < N < 1.000.000
Exemplul 1[edit | edit source]
input.txt:
5
2 3
output.txt:
8
Explicație:
0000110
0001100
0001110
0011000
0011100
0110000
0110110
0111000
Exemplul 2[edit | edit source]
input.txt:
999999999
2 3
Output:
Constrangeri neindeplinite
Rezolvare[edit | edit source]
<syntaxhighlight lang="python3" line="1"> mod = 666013
def ver(n, p, q):
if not(1<=n<=1000000): print("Constrangeri neindeplinite") exit() if not(1<=p<=1000000): print("Constrangeri neindeplinite") exit() if not(1<=q<=1000000): print("Constrangeri neindeplinite") exit() if not(p>=q): print("Constrangeri neindeplinite") exit() if not(q>=n): print("Constrangeri neindeplinite") exit()
def main():
with open("input.txt", "r") as in_file, open("output.txt", "w") as out_file: n=int(in_file.readline().strip()) a, b = map(int, in_file.readline().split())
ver(n,a, b) z = [0] * (n + 1) s = [0] * (n + 1) u = [0] * (n + 1)
z[0] = 1 s[0] = 1
for i in range(1, n + 1): z[i] = z[i - 1] + u[i - 1] # daca punem 0 z[i] %= mod
if i - a >= 0: if i - b - 1 >= 0: u[i] = s[i - a] - s[i - b - 1] else: u[i] = s[i - a]
if u[i] < 0: u[i] += mod u[i] %= mod
s[i] = s[i - 1] + z[i] s[i] %= mod
result = (z[n] + u[n] - 1 + (z[n] + u[n] - 1 < 0) * mod) % mod out_file.write(str(result) + '\n')
if __name__ == "__main__":
main()
</syntaxhighlight>