Se consideră un număr natural K
și o secvență de N
șiruri s[1]
, s[2]
, …, s[N]
. Fiecare șir este format din cifre distincte. Pentru două șiruri s[i]
și s[j]
se definește operația de scădere (–
) astfel: s[i]-s[j]
va conține doar șirul de cifre care apar în s[i]
, dar nu apar în s[j]
. De exemplu, dacă s[i]=(1,3,8)
și s[j]=(2,9,3)
, atunci s[i]-s[j]=(1,8)
. Această operație nu este asociativă, (s[i]-s[j])-s[p]
este diferită de s[i]-(s[j]-s[p])
. De aceea, dacă se alege un subșir s[i1]
, s[i2]
, …, s[ip]
din secvență, atunci convenim ca s[i1]-s[i2]-...-s[ip]
să se execute de la dreapta la stânga.
Exemplu: (1,2,3)-(2,3)-(1,3)=(1,2,3)-(2)=(1,3)
. S-au obținut două cifre distincte.
Cerința
Să se determine numărul subșirurilor nevide s[i1]
, s[i2]
, …, s[ip]
din secvența s[1]
, s[2]
, …, s[N]
asupra cărora, dacă se efectuează operația de scădere (adică s[i1]-s[i2]-...-s[ip]
), se obțin cel puțin K
cifre distincte. Pentru că numărul subșirurilor poate fi foarte mare, atunci el se va calcula modulo 123457
.
Date de intrare
Fișierul de intrare ksiruri.in
conține pe prima linie numerele naturale K
și N
. Pe următoarele N
linii se află câte un șir s[i]
. Linia i+1
, i = 1..N
, va conține valorile m c[1] c[2] .. c[m]
, unde m
este numărul de termeni al șirului s[i]
, iar c[1]
, c[2]
, …, c[m]
sunt cifrele distincte ale șirului s[i]
.
Date de ieșire
Fișierul de ieșire ksiruri.out
va conține reprezentând numărul de subșiruri, modulo 123457
.
Restricții și precizări
1 ≤ K ≤ 8
2 ≤ N ≤ 50 000
1 ≤ i1 < i2 < ... < ip ≤ N
Exemplu
ksiruri.in
3 3 5 5 6 7 8 9 3 4 5 6 3 7 8 9
ksiruri.out
6
Explicație
s1 = 5 6 7 8 9
s2 = 4 5 6
s3 = 7 8 9
Cele șase subșiruri nevide sunt:
s1
, s1-s2
, s1-s2-s3
, s2
, s2-s3
, s3
Cum e corect?
cout < "As la info";
cout << "As la info";
cout >> "As la info";
Felicitări! Poți mai mult?
Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.
Greșit, dar nu-i bai!
Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.
Rezolvare
Iată rezolvarea de 100 de puncte pentru problema KSiruri:
#include <bits/stdc++.h>
#define nmax 50005
#define MOD 123457
#define inFile "ksiruri.in"
#define outFile "ksiruri.out"
using namespace std;
int a[nmax], n, K;
int d[1030], v[1030];
void Citire()
{
int i, j, x, m;
ifstream fin(inFile);
fin >> K >> n;
for (i = 1; i <= n; ++i)
{
fin >> m;
for (j = 1; j <= m; ++j)
{
fin >> x;
a[i] |= (1 << x);
}
}
fin.close();
}
inline int NrBiti(int n)
{
int cnt = 0;
while (n > 0)
{
cnt++;
n = n & (n - 1);
}
return cnt;
}
void Dinamica()
{
int i, j, x, y;
d[a[n]] = 1;
for (i = n - 1; i >= 1; --i)
{
for (j = 0; j < 1024; ++j)
v[j] = d[j];
x = a[i];
v[x]++;
if (v[x] == MOD) v[x] = 0;
for (j = 0; j < 1024; ++j)
if (d[j] > 0)
{
y = x ^ (x & j);
v[y] += d[j];
}
for (j = 0; j < 1024; ++j)
d[j] = v[j] % MOD;
}
}
void Afisare()
{
int i, cnt;
cnt = 0;
for (i = 0; i < 1024; ++i)
if (NrBiti(i) >= K && d[i] > 0)
cnt += d[i];
cnt %= MOD;
ofstream fout(outFile);
fout << cnt << "
";
fout.close();
}
int main()
{
Citire();
Dinamica();
Afisare();
return 0;
}
Atenție
Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa .
Rezolvarea problemei #1737 KSiruri
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #1737 KSiruri de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.
Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!