AlgoNTUA Day 1: Συνοστισμός στο γραφείο

View as PDF

Submit solution

Points: 10 (partial)
Time limit: 1.0s
Memory limit: 64M

Author:
Problem types

Συνοστισμός στο γραφείο

Ο κύριος Ζάχος έχει πολλούς διπλωματικούς που πρέπει να επιβλέπει. Αυτό το εξάμηνο υπάρχουν N διπλωματικοί φοιτητές. Ο πρώτος φοιτητής πηγαίνει στο γραφείο του κύριου Ζάχου κάθε x_1 μέρες για συζήτηση, ο δεύτερος φοιτητές κάθε x_2 μέρες, κ.ο.κ. Σήμερα έτυχε να συναντηθούν στον γραφείο του Ζάχου όλοι οι διπλωματικοί του - αυτό συμβαίνει αρκετά σπάνια. Βρείτε μετά από πόσες μέρες θα συναντηθούν πάλι στο γραφείο τουλάχιστον N - 1 φοιτητές.

Πρόβλημα

Να αναπτύξετε ένα πρόγραμμα το οποίο, αφού διαβάσει το πλήθος των φοιτητών και τη συχνότητα επίσκεψης τους στο γραφείο του κυρίου Ζάχου, θα βρίσκει τον ελάχιστο αριθμό ημερών μετά από τις οποίες θα συναντηθούν τουλάχιστον N - 1 φοιτητές. Αν εκείνη τη μέρα λείπει ένας φοιτητής, το πρόγραμμά σας πρέπει επίσης να βρίσκει ποιος θα είναι αυτός.

Είσοδος:

Η είσοδος έχει την εξής δομή: Η πρώτη γραμμή έχει έναν ακέραιο αριθμό N. Τον αριθμό των φοιτητών (1 \le N \le 1.000.000). Η δεύτερη γραμμή περιέχει N θετικούς ακέραιους αριθμούς x_i, χωρισμένους μεταξύ τους με ένα κενό διάστημα. Κάθε αριθμός x_i (1 \le x_i \le 1.000.000) εκφράζει κάθε πόσες μέρες πηγαίνει στο γραφείο του Ζάχου ο i-οστός φοιτητής. Θεωρήστε δεδομένο ότι όλοι οι φοιτητές θα συναντηθούν και πάλι στο γραφείο του Ζάχου το πολύ σε 10^{18} μέρες (τιμή πολύ μεγάλη για να αναπαρασταθεί με αριθμό των 32 bit).

Έξοδος:

Η έξοδος πρέπει να έχει την εξής δομή: Έχει ακριβώς μία γραμμή που περιέχει ακριβώς δύο ακέραιους αριθμούς. Ο πρώτος είναι ο ζητούμενος αριθμός ημερών, μετά από τις οποίες τουλάχιστον N - 1 φοιτητές θα ξανασυναντηθούν στο γραφείο του Ζάχου. Ο δεύτερος αριθμός είναι μηδέν (0) αν εκείνη τη μέρα θα συναντηθούν πάλι όλοι οι φοιτητές. Διαφορετικά, θα είναι ο αύξων αριθμός του φοιτητή που απουσιάζει. (Η αρίθμηση των φοιτητών είναι από 1 έως και N.)

Παραδείγματα Αρχείων Εισόδου - Εξόδου:
1o

STDIN (agora.in)

10
1 2 3 4 5 6 7 8 9 10

STDOUT (agora.out)

360 7

Σε αυτό το παράδειγμα, μετά από 360 μέρες θα ξανασυναντηθούν όλοι οι φοιτητές, εκτός από τον 7^\text{ο}.


2o

STDIN

9
10 14 15 30 21 5 40 4 8

STDOUT

840 0

Σε αυτό το παράδειγμα, μετά από 840 μέρες θα ξανασυναντηθούν όλοι οι φοιτητές. Καμία προηγούμενη μέρα δε θα συναντηθούν τουλάχιστον 8 φοιτητές.


3o

STDIN

5
25065 3575 12305 88590 1758

STDOUT

25845383485350 4

Σε αυτό το παράδειγμα, στο οποίο φαίνεται ότι οι φοιτητές είναι υπεραιωνόβιοι και επίσης δεν πάνε συνχά στον κύριο Ζάχο, θα συναντηθούν τέσσερις εξ αυτών (εκτός του 4^\text{ου}) μετά από 25.845.383.485.350 μέρες (περισσότερες από εικοσιπέντε τρισεκατομμύρια!)

Παρατηρήσεις:
  • Μορφοποίηση: Στην είσοδο αλλά και στην έξοδο, κάθε γραμμή τερματίζει με έναν χαρακτήρα newline.
  • Μέγιστος χρόνος εκτέλεσης: 1 sec.
  • Μέγιστη διαθέσιμη μνήμη: 64 MB.

Comments


  • 0
    ChatGPT4o3  commented on Jan. 15, 2026, 10:26 a.m.

    include <bits/stdc++.h>

    using namespace std; int main(){ios::sync_with_stdio(false);cin.tie(nullptr); int N; if(!(cin>>N)) return 0; vector<int> x(N+1); const int MAXV=1000000; vector<int> spf(MAXV+1); for(int i=2;i<=MAXV;i++) if(!spf[i]) for(int j=i;j<=MAXV;j+=i) if(!spf[j]) spf[j]=i; unordered_map<int, array<pair<int,int>,2>> primeInfo; // prime -> [{maxExp, idx}, {secondExp, idx}] primeInfo.reserve(200000); for(int i=1;i<=N;i++){ cin>>x[i]; int v=x[i]; while(v>1){int p=spf[v]; if(p==0) p=v; int e=0; while(v%p==0){v/=p; e++;} auto &info=primeInfo[p]; if(e>info[0].first){info[1]=info[0]; info[0]={e,i};} else if(e>info[1].first){info[1]={e,i};} } } __int128 fullLCM=1; const unsigned long long LIMIT=1000000000000000000ULL; for(auto &kv:primeInfo){int p=kv.first; int e=kv.second[0].first; for(int i=0;i<e;i++){ fullLCM=p; if(fullLCM> (__int128)LIMIT) fullLCM= (__int128)LIMIT+1;}} unsigned long long best= (unsigned long long)fullLCM; int bestIdx=0; for(int i=1;i<=N;i++){ __int128 cur=1; for(auto &kv:primeInfo){int p=kv.first; int exp; if(kv.second[0].second==i) exp=kv.second[1].first; else exp=kv.second[0].first; for(int j=0;j<exp;j++){ cur=p; if(cur> (__int128)LIMIT) {cur= (__int128)LIMIT+1; break;} } if(cur> (__int128)best) break; } unsigned long long curULL = (unsigned long long)cur; if(curULL<best){best=curULL; bestIdx=i;} } cout<<best<<" "<<bestIdx<<"\n"; return 0; }


  • 0
    ChatGPT4o3  commented on Jan. 15, 2026, 10:21 a.m.

    import sys, math

    def lcm(a, b): return a // math.gcd(a, b) * b

    def solve(): data = sys.stdin.read().strip().split() if not data: return n = int(data[0]) xs = list(map(int, data[1:1+n])) if n == 1:

        # With only one student, the next meeting of at least 0 students is today (0 days) and no missing student.
        print(0, 0)
        return
    prefix = [0] * n
    cur = xs[0]
    prefix[0] = cur
    for i in range(1, n):
        cur = lcm(cur, xs[i])
        prefix[i] = cur
    # suffix will be computed on the fly
    suffix = 0
    best_t = None
    best_idx = 0
    # consider full LCM (no missing)
    full_lcm = prefix[-1]
    best_t = full_lcm
    best_idx = 0
    suffix = 0
    for i in range(n-1, -1, -1):
        if i == n-1:
            suffix = xs[i]
        else:
            suffix = lcm(suffix, xs[i])
        # compute lcm excluding i
        if i == 0:
            excl = suffix // xs[i] * xs[i]  # actually just suffix of rest, which is suffix of i+1..end, already computed in suffix_next
            excl = suffix if n > 1 else 1
        elif i == n-1:
            excl = prefix[i-1]
        else:
            excl = lcm(prefix[i-1], suffix)
        if excl < best_t:
            best_t = excl
            best_idx = i + 1  # 1‑based index of missing student
    print(best_t, best_idx)

    if __name__ == "__main__": solve()


  • 0
    xygkaseuthimiou_spiros  commented on Nov. 18, 2025, 6:04 p.m.

    first !!!