Aiuto con Fractal Painting

Salve, sto cercando di risolvere fractal ma non riesco a ottenere più di 95/100, in un solo test case l’esecuzione supera il tempo limite.
Sostanzialmente ho due matrici, una per il modello e una che conterrà il disegno finale da stampare. Ogni volta analizzo la matrice e a seconda di se trovo un punto o un asterisco piazzo un modello o un quadro di asterischi nella posizione corretta all’interno della matrice stessa.
Ho provato in vari modi a ottimizzare il codice rendendolo quasi illeggibile… prima ho provato a velocizzare l’I/O con le funzioni unlocked, poi ho trasformato le matrici in array per risparmiare iterazioni.
Qualcuno può aiutarmi?

#include <stdio.h>
#include <math.h>
#include <string.h>

int main() {
    FILE *fin = fopen("input.txt", "rb");

    // Acquisizione N e K
    int N=0, K=0, MAXN;
    char read;
    read=fgetc_unlocked(fin);
    do {
        N=(N<<3)+(N<<1)+(read-'0');
        read=fgetc_unlocked(fin);
    } while(read>='0'&&read<='9');
    read=fgetc_unlocked(fin);
    do {
        K=(K<<3)+(K<<1)+(read-'0');
        read=fgetc_unlocked(fin);
    } while(read>='0'&&read<='9');
    MAXN = pow(N, K);

    // Acquisizione modello e inizializzazione matrice finale
    char model[N*N], matrix[MAXN*(MAXN+1)];
    int r, c, i, n;

    for(r=0; r<MAXN; r++) {
        matrix[r*(MAXN+1)+MAXN] = '\n';
    }
    for(r=0; r<N; r++) {
        fread_unlocked(&model[r*N], N, 1, fin);
        memcpy(&matrix[r*(MAXN+1)], &model[r*N], N);
        fgetc_unlocked(fin);
    }
    fclose(fin);

    // Calcolo matrice finale
    for(n=N; n!=MAXN; n*=N) {
        for(r=n-1; r>=0; r--) {
            for(c=n-1; c>=0; c--) {
                if(matrix[r*(MAXN+1)+c] == '.') {
                    for(i=0; i<N; i++) {
                        memcpy(&matrix[(r*N+i)*(MAXN+1)+c*N], &model[i*N], N);
                    }
                } else {
                    for(i=0; i<N; i++) {
                        memset(&matrix[(r*N+i)*(MAXN+1)+c*N], '*', N);
                    }
                }
            }
        }
    }

    // Stampa
    FILE *fout = fopen("output.txt", "wb");
    fwrite_unlocked(matrix, MAXN+1, MAXN, fout);
    fclose(fout);

    return 0;
}