Editorial for COCI '06 Contest 6 #5 V
Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence.
Submitting an official solution before solving the problem yourself is a bannable offence.
If is larger than say , then is at most , meaning that there are at most one million multiples of to check. A "naive" solution that checks each and verifies that it is composed of the given digits is efficient enough.
If is at most , then integers divided by give remainders no larger than .
We will construct the function , the number of multiples of between and , if we still have to place more digits (of ) and represents the digits already placed.
To calculate the values of this function, first observe that, for any and , we can only form numbers between and , inclusive. Based on this we recognise three cases:
- If all numbers are between and , then the actual prefix doesn't matter when forming the rest of the number, just its remainder when divided by . The limited range of the remainders reduces the state space and we can memoize the values of the function based on the remainder.
- If all numbers are less than or greater than , then the value is zero.
- If some (but not all) numbers are between and , then the value of the function doesn't depend only on the remainder of dividing the prefix by , so it isn't possible to memoize the value of the function on the remainder. Luckily, there are few such cases (proportional to the length of the number).
Comments