WeakHash 38/100

Testo: WeakHash

Subtask 5: tutti i testcase execution timed out.
Subtask 6: tutti i testcase execution timed out.
Subtask 7: tutti i testcase output isn’t correct con tempi bassissimi di esecuzione (0.005s - 256 KiB)

#include <iostream>
#include <cassert>
#include <cmath>

using namespace std;

constexpr int MOD = 10000019;

int N, H;

int main() {
    assert(cin >> N);
    assert(cin >> H);

    long long int inizio, fine, C = 0;
    
    inizio = pow(10, N-1);
    fine = pow(10, N)-1;

    long long int p = 1, n, i;
    for(i=fine; i>=inizio; i--) {
        n = i;
        while (n != 0)
        {
            p = p * (n % 10);
            n = n / 10;
        }
        if(p == H)
            C++;
        p = 1;
    }
    
    cout << C % MOD << endl;
    return 0;
}

Questo problema non è tanto facile (né particolarmente bello, ma questa è un’altra storia), e sicuramente non voglio spoilerarti la soluzione.

Però è interessante capire a cosa sono dovuti quegli strani output di valutazione. Dovrebbe essere chiaro il motivo degli Execution timed out dei subtask 5 e 6 (quante iterazioni fa il ciclo for?), ma perché mai nel 7, che ha limiti su N ben più alti, il programma dovrebbe terminare dopo una frazione di secondo dando output errato? Cerca di pensare a un motivo per cui questo succede.

L’unica cosa che mi viene in mente per tempi così bassi nella subtask 7 è che il valore con cui inizia il for (fine) è così grande da non entrare proprio nel ciclo ma apparte questo non mi viene in mente niente per poter ottimizzare il codice nelle subtask 5 e 6 potresti darmi qualche suggerimento?

Eh, quasi… Se fine è grande in realtà nel ciclo ci entra eccome. Il problema si ha quando fine < inizio. Secondo te si può verificare questa strana condizione, e se sì, quando?

Non penso si possa verificare il caso che dici tu, in quanto dovresti mettere n < 0, ma non esistono numeri con il numero di cifre negative e se metti solo positivi è impossibile che fine < inizio