Cicla e moltiplica (shiftmul) - 0/100, esempi corretti

Ciao a tutti, sto provando a risolvere Cicla e Moltiplica e il mio programma esegue correttamente tutti gli esempi, per poi dare output non corretti dopo al submit (a parte degli “execution timed out” nell’ultimo subtask).
Ero già riuscito a ottenere 10/100 a forza bruta, ma non riesco a far funzionare questa ottimizzazione:

#include <vector>
#include <iostream>

using namespace std;


long long int gcd(long long int a, long long int b)
{
    if (b == 0) return a;
    return gcd(b, a % b);
}


long long int power(long long int x, long long int y, long long int p) 
{
    long long int res = 1;

    while (y > 0) {
        if (y % 2 == 1) res = res * x;
        y = y >> 1;
        x = (x * x);
    }
    return res % p;
}

vector<int> execute(int N, int K, int D, vector<int> A) {
    vector<int> B(N);
    for (int i = 0; i < N; ++i) {
        B[i] = 1;
    }

    long long int modulo = 1e9 + 7;
    long long int mcd = gcd(N, D);
    long long int C = N/(mcd);
    long long int r = K % C;

    for (int i = 0; i < N; i++) {
        int k = i;
        for (int j = 0; j < C; j++) {
            if (j < r) {
                B[i] = (B[i] * A[k]) % modulo;
            }
            B[i] *= power(A[k], K / C, modulo) % modulo;

            //cicla
            k = (k-D+N)%N;
        }
    }

    return B;

}

Ho messo tutte le variabili come long long int per evitare l’overflowing, ma a quanto pare non è quello il problema.

Grazie!

I long long non sono una formula magica per evitare gli overflow: anche loro possono benissimo overfloware. In particolare le potenze che calcoli sono decisamente troppo grandi per stare in un long long.

Ovviamente la riduzione in modulo non è una richiesta stravagante dell’autore del problema, ma la risposta alla necessità di mantenere i valori in gioco in questo problema rappresentabili in tipi numerici a precisione finita. Grazie a questo “stratagemma” puoi (e devi) ridurre in modulo dopo ogni singola operazione così da poter lavorare sempre con valori numerici rappresentabili da un long long,

Grazie, avevo dimenticato di mettere in modulo anche le singole operazioni nella esponenziazione veloce. Dopo aver sistemato quello e un piccolo bug che avevo nel primo subtask ho ottenuto 50/100, ora devo solo sistemare il problema del TLE nel subtask 4

Sono riuscito a sistemare quel problema e a ottimizzare il codice, ma sono giunto a un vicolo cieco: nell’ultimo subtask ho due TLE e 1 output non corretto. Ho provato a creare degli input di ogni tipo per scovare il bug ma ancora non ce l’ho fatta, qualcuno ha qualche idea su quale possa essere?