Cute Chef Gift – Omówienie zadania – Rozszerzone Sito Eratostenesa / Na później

Cute Chef Gift – Omówienie zadania – Rozszerzone Sito Eratostenesa / Na później

Szczegółowe omówienie zadania Cute Chef Gift:

Link do powyższego omówienia zadania Cute Chef Gift: https://youtu.be/rhz5sEdxHQE?t=791
Omówienie kodu zadania Cute Chef Gift: https://youtu.be/rhz5sEdxHQE?t=4751
Kroki algorytmu: https://youtu.be/rhz5sEdxHQE?t=4196
Złożoność algorytmu: https://youtu.be/rhz5sEdxHQE?t=4448

Link do treści zadania Cute Chef Gift i możliwości umieszczania rozwiązań:
https://www.codechef.com/problems/COPAR

Zadanie Cute Chef Gift pokazuje zastosowanie Rozszerzonego Sita Eratostenesa: https://youtu.be/rhz5sEdxHQE?t=2409
Jak rozłożyć liczbę na czynniki pierwsze przy pomocy Rozszerzonego Sita Eratostenesa: https://youtu.be/rhz5sEdxHQE?t=2948
Złożoność rozkładu liczby na czynniki pierwsze przy pomocy Rozszerzonego Sita Eratostenesa:https://youtu.be/rhz5sEdxHQE?t=3087
Kod Rozszerzonego Sita Eratostenesa: https://youtu.be/rhz5sEdxHQE?t=4815


Jak się uczyć na podstawie tego zadania? https://youtu.be/QgLyXYmFQeU?t=2019
Pamiętaj by zajrzeć max 1 raz – wtedy się rozwijasz: https://youtu.be/pkLXuuOe_qA?t=3625

Lista zadań z rozwiązaniami: https://oki.org.pl/lista-zadan-materialy.php
Samouczek – przygotowanie do Olimpiad: https://oki.org.pl/tutorial/
Zajęcia: https://oki.org.pl/harmonogram-zajec/

Warto startować w Olimpiadzie Informatycznej!
https://youtu.be/K7fZfJ8nN6A?t=109


Kod C++ programu Cute Chef Gift, który jest omówiony w powyższym filmie i który otrzymuje 100%


#include <bits/stdc++.h>
using namespace std;

const int MAXN = 1e5 + 7;

// dzielnik[i] = dowolny dzielnik pierwszy liczby i
int dzielnik[MAXN];
// gdzieLewo[p] = pierwszy indeks,
// na ktorym liczba jest podzielna przez p (pierwsze)
int gdzieLewo[MAXN];
// gdziePrawo[p] = ostatni indeks,
// na ktorym liczba jest podzielna przez p (pierwsze)
int gdziePrawo[MAXN];

int ilePrzedzialow[MAXN];

void sito()
{
	for (int i = 2; i*i < MAXN; ++i) {
		if (dzielnik[i] == 0) {
			for (int j = i*i; j < MAXN; j += i)
				dzielnik[j] = i;
		}
	}
	for (int i = 2; i < MAXN; ++i) {
		if (dzielnik[i] == 0)
			dzielnik[i] = i;
	}
}

void solve()
{
	// zerowanie tablic
	for (int i = 0; i < MAXN; ++i) {
		gdzieLewo[i] = MAXN - 1; // [MAXN-1, 0]
		gdziePrawo[i] = 0;
		ilePrzedzialow[i] = 0;
	}

	int n;
	cin >> n;
	for (int i = 1; i <= n; ++i) {
		int a;
		cin >> a;
		// rozklad liczby a na czynniki pierwsze
		while (a > 1) {
			int p = dzielnik[a];
			gdzieLewo[p] = min(gdzieLewo[p], i);
			gdziePrawo[p] = max(gdziePrawo[p], i);
			a /= p;
		}
	}

	for (int i = 2; i < MAXN; ++i) {
		int l = gdzieLewo[i];
		int r = gdziePrawo[i];
		if (l <= r) {
			ilePrzedzialow[l] += 1;
			ilePrzedzialow[r] -= 1;
		}
	}
	for (int i = 1; i <= n; ++i)
		ilePrzedzialow[i] += ilePrzedzialow[i - 1];

	for (int i = 1; i < n; ++i) {
		if (ilePrzedzialow[i] == 0) {
			cout << i << '\n';
			return;
		}
	}
}

int main()
{
	ios_base::sync_with_stdio(0), cin.tie(0);

	sito();

	int T;
	cin >> T;
	for (int i = 0; i < T; ++i)
		solve();
	return 0;
}
Kod C++ programu Cute Chef Gift, który jest omówiony w powyższym filmie i który otrzymuje 100%

 


Kod Python programu Cute Chef Gift , który otrzymuje 100%:

MAXN = 100000 + 7

# dzielnik[i] = dowolny dzielnik pierwszy liczby i
dzielnik = [0]*MAXN

def sito():
	i = 2
	while (i*i < MAXN): if (dzielnik[i] == 0): for j in range(i*i, MAXN, i): dzielnik[j] = i i = i + 1 for i in range(2, MAXN): if (dzielnik[i] == 0): dzielnik[i] = i def solve(): # gdzieLewo[p] = pierwszy indeks, # na ktorym liczba jest podzielna przez p (pierwsze) gdzieLewo = [MAXN]*MAXN # gdziePrawo[p] = ostatni indeks, # na ktorym liczba jest podzielna przez p (pierwsze) gdziePrawo = [0]*MAXN n = int(input()) liczby = list(map(int, input().split())) for i in range(n): a = liczby[i] # rozklad liczby a na czynniki pierwsze while (a > 1):
			p = dzielnik[a]
			gdzieLewo[p] = min(gdzieLewo[p], i+1)
			gdziePrawo[p] = max(gdziePrawo[p], i+1)
			a //= p

	ilePrzedzialow = [0]*(n + 1)
	for i in range(MAXN):
		l = gdzieLewo[i]
		r = gdziePrawo[i]
		if (l <= r):
			ilePrzedzialow[l] += 1
			ilePrzedzialow[r] -= 1

	for i in range(1, n):
		ilePrzedzialow[i] += ilePrzedzialow[i - 1]

	for i in range(1, n):
		if (ilePrzedzialow[i] == 0):
			print(i)
			return

sito()

T = int(input())
for i in range(T):
	solve()

Nie dodano jeszcze komentarza, rozpocznij dyskusję pierwszy.

Dodaj komentarz