Pub Encounter (pickup) 20/100 non so come velocizzare

Questo è il programma che ho realizzato, ci ho messo qualche commento per riuscire a comprenderlo meglio. Come posso migliorare il tempo di esecuzione? C’era qualche modo per farlo più semplicemente a cui non ho pensato?
Link del problema:CMSocial - a social coding app


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>

// input data
int A, B;
long long K;
char s[20];

int main() {
    assert(3 == scanf("%d %d %lld", &A, &B, &K));
	int c=2,n,somma,check,i,j;
    for(i=0;i<K;c++){
		n=A*c; //n è un numero multiplo di A, c parte da 2 ed ogni volta che il ciclo riinizia aumenta di 1
    	sprintf(s,"%d",n); //lo mette in una stringa
    	somma=0;
    	check=0;
    	for(j=strlen(s)-1;j>=0;j--){ //controlla la stringa partendo dalla prima cifra
    		somma+=(int)s[j]-48; //fa la somma delle cifre
    		if(s[j]=='0' || somma>B){ //controlla le cifre singolarmente, e quando la cifra è 0 oppure la somma delle cifre supera B esce
    			check=1;
    			break;
			}
		}
		if(somma!=B){ //in caso non ci siano 0 nel numero ma la somma non è B 
			check=1;	
		}
		if(check==0) i++; //se nessuno dei due precedenti if risulta vero vuol dire che il numero rispetta le condizioni della traccia (essere multiplo di A e la somma delle cifre fa B)
		if(i==K) break; //quando abbiamo trovato il K-esimo numero della sequenza esce dal ciclo principale e fa apparire a schermo la soluzione
	}
    printf("%s\n", s); // print the result
    return 0;
}

Anziché controllare i numeri uno alla volta, devi trovare un modo efficiente di controllare più numeri contemporaneamente.
Prova a pensare un modo di calcolare velocemente tutti i numeri validi lunghi x cifre.

Onestamente non mi viene nulla in mente, solo di prendere B ed trovare direttamente i numeri dalla somma delle cifre e vedere se sono divisibili per 3, però non saprei come salvare nella stringa ogni volta 1,8 2,7 3,6 (per il primo caso di esempio) perchè non so gestirlo quando arriva a cifre maggiori, oltre questo non mi viene in mente altro

Supponiamo per semplificare il problema che A=1. Vogliamo quindi calcolare quanti sono i numeri di x cifre che hanno somma B.

Puoi procedere usando la programmazione dinamica. Fissata l’ultima cifra d, ci basta calcolare ricorsivamente il numero di numeri validi di x-1 cifre che hanno somma B-d. Per trovare il valore che cercavamo ci basta quindi provare tutte le cifre da 1 a 9 e sommare i risultati ottenuti.

1 Mi Piace