<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.universitas.ro/index.php?action=history&amp;feed=atom&amp;title=1195_-_NMult</id>
	<title>1195 - NMult - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.universitas.ro/index.php?action=history&amp;feed=atom&amp;title=1195_-_NMult"/>
	<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1195_-_NMult&amp;action=history"/>
	<updated>2026-05-01T23:22:21Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1195_-_NMult&amp;diff=6161&amp;oldid=prev</id>
		<title>Catalin Moje: Pagină nouă: ==Enunț== Se consideră trei numere naturale nenule n, k și w.  ==Cerința== Să se scrie un program care determină numărul m al mulțimilor de forma {x[1], x[2], … ,x[k]} având ca elemente numere naturale nenule, ce satisfac simultan condițiile:  1 ≤ x[1] &lt; x[2] &lt; ... &lt; x[k] ≤ n x[i+1] - x[i] ≥ w, 1 ≤ i ≤ k - 1  ==Date de intrare== Fișierul de intrare nmult.in conține pe prima linie trei numere naturale nenule n, k, w separate prin câte un spaţiu, cu se...</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1195_-_NMult&amp;diff=6161&amp;oldid=prev"/>
		<updated>2023-05-07T17:59:12Z</updated>

		<summary type="html">&lt;p&gt;Pagină nouă: ==Enunț== Se consideră trei numere naturale nenule n, k și w.  ==Cerința== Să se scrie un program care determină numărul m al mulțimilor de forma {x[1], x[2], … ,x[k]} având ca elemente numere naturale nenule, ce satisfac simultan condițiile:  1 ≤ x[1] &amp;lt; x[2] &amp;lt; ... &amp;lt; x[k] ≤ n x[i+1] - x[i] ≥ w, 1 ≤ i ≤ k - 1  ==Date de intrare== Fișierul de intrare nmult.in conține pe prima linie trei numere naturale nenule n, k, w separate prin câte un spaţiu, cu se...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==Enunț==&lt;br /&gt;
Se consideră trei numere naturale nenule n, k și w.&lt;br /&gt;
&lt;br /&gt;
==Cerința==&lt;br /&gt;
Să se scrie un program care determină numărul m al mulțimilor de forma {x[1], x[2], … ,x[k]} având ca elemente numere naturale nenule, ce satisfac simultan condițiile:&lt;br /&gt;
&lt;br /&gt;
1 ≤ x[1] &amp;lt; x[2] &amp;lt; ... &amp;lt; x[k] ≤ n&lt;br /&gt;
x[i+1] - x[i] ≥ w, 1 ≤ i ≤ k - 1&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Fișierul de intrare nmult.in conține pe prima linie trei numere naturale nenule n, k, w separate prin câte un spaţiu, cu semnificaţia de mai sus.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Fișierul de ieșire nmult.out va conține pe prima linie restul împărţirii numărului m la 666013.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
&lt;br /&gt;
1 ≤ n, k, w ≤ 1.000.000;&lt;br /&gt;
&lt;br /&gt;
==Exemplu==&lt;br /&gt;
===Exemplu1===&lt;br /&gt;
 &lt;br /&gt;
nmult.in&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
5 2 2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
nmult.out&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
6&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Exemplu2===&lt;br /&gt;
nmult.in&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
10 3 4&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
nmult.out&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
4&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Exemplu3===&lt;br /&gt;
nmult.in&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
10 4 4&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
nmult.out&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
def validare(n, k, w):&lt;br /&gt;
    if not(1 &amp;lt;= n &amp;lt;= 1000000 and 1 &amp;lt;= k &amp;lt;= 1000000 and 1 &amp;lt;= w &amp;lt;= 1000000):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def rezolvare(n, k, w):&lt;br /&gt;
    MOD = 666013&lt;br /&gt;
    # Cazul de bază&lt;br /&gt;
    if k == 1:&lt;br /&gt;
        return n&lt;br /&gt;
&lt;br /&gt;
    # Cazul în care diferența minimă între elemente este mai mare decât n&lt;br /&gt;
    if w &amp;gt;= n:&lt;br /&gt;
        return 0&lt;br /&gt;
&lt;br /&gt;
    # Aplicăm formula de recursivitate&lt;br /&gt;
    dp = [[0 for _ in range(k + 1)] for _ in range(n + 1)]&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        dp[i][1] = 1&lt;br /&gt;
    for j in range(2, k + 1):&lt;br /&gt;
        for i in range(1, n + 1):&lt;br /&gt;
            dp[i][j] = (dp[i - 1][j] + dp[max(0, i - w)][j - 1]) % MOD&lt;br /&gt;
&lt;br /&gt;
    # Suma soluțiilor pentru mulțimile de k elemente&lt;br /&gt;
    sol = 0&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        sol = (sol + dp[i][k]) % MOD&lt;br /&gt;
&lt;br /&gt;
    return sol&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;nmult.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        n, k, w = map(int, fin.readline().split())&lt;br /&gt;
&lt;br /&gt;
    if not validare(n, k, w):&lt;br /&gt;
        print(&amp;quot;Date de intrare invalide&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    m = rezolvare(n, k, w)&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;nmult.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        fout.write(str(m) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicații ==&lt;br /&gt;
Codul are trei funcții principale:&lt;br /&gt;
&lt;br /&gt;
Funcția validare primește parametrii n, k și w și verifică dacă aceștia sunt în intervalul valid (între 1 și 1000000). Dacă parametrii nu sunt în intervalul valid, se returnează False, altfel se returnează True.&lt;br /&gt;
&lt;br /&gt;
Funcția rezolvare primește parametrii n, k și w. În primul rând, se verifică cazurile speciale. Dacă k == 1, atunci numărul de mulțimi posibile este n. Dacă w &amp;gt;= n, atunci nu există nicio mulțime de k elemente cu diferența între oricare 2 termeni consecutivi mai mare sau egală cu w, așadar numărul de mulțimi posibile este 0.&lt;br /&gt;
&lt;br /&gt;
În cazul general, se aplică formula de recursivitate pentru a calcula numărul de mulțimi posibile. Mai precis, se calculează matricea dp, unde dp[i][j] reprezintă numărul de mulțimi de j elemente care se termină cu numărul i și ale căror diferențe între oricare 2 termeni consecutivi sunt cel puțin w. Acest lucru se realizează cu ajutorul formulei: dp[i][j] = dp[i-1][j] + dp[max(0, i-w)][j-1].&lt;br /&gt;
&lt;br /&gt;
În cele din urmă, se calculează suma soluțiilor pentru toate mulțimile de k elemente, care încep cu elementul 1 până la elementul n-w+1.&lt;br /&gt;
&lt;br /&gt;
Funcția main citește datele de intrare din fișierul nmult.in și le validează cu ajutorul funcției validare. Apoi, calculează soluția problemei cu ajutorul funcției rezolvare și o scrie în fișierul nmult.out.&lt;/div&gt;</summary>
		<author><name>Catalin Moje</name></author>
	</entry>
</feed>