Problem Statement : Nimxor and Bit-Strings
Please help me with the above problem which is being placed in the DP category. Also there is no editorial provided for this problem.
# | User | Rating |
---|---|---|
1 | tourist | 4009 |
2 | jiangly | 3823 |
3 | Benq | 3738 |
4 | Radewoosh | 3633 |
5 | jqdai0815 | 3620 |
6 | orzdevinwang | 3529 |
7 | ecnerwala | 3446 |
8 | Um_nik | 3396 |
9 | ksun48 | 3390 |
10 | gamegame | 3386 |
# | User | Contrib. |
---|---|---|
1 | cry | 167 |
2 | maomao90 | 163 |
2 | Um_nik | 163 |
4 | atcoder_official | 161 |
5 | adamant | 159 |
6 | -is-this-fft- | 158 |
7 | awoo | 157 |
8 | TheScrasse | 154 |
9 | nor | 153 |
9 | Dominater069 | 153 |
Problem Statement : Nimxor and Bit-Strings
Please help me with the above problem which is being placed in the DP category. Also there is no editorial provided for this problem.
Name |
---|
My guess would be write a function that can perform integer division between the string given and an integer using a standard algorithm. Then for each of the numbers j between 1 and 100 inclusive store the result of the division between the string given and j. Say the result is stored in an array called dp. Finally assume we have stored the q integers that they gave in an array called A. Set the ans to 0 then for each A[j] add dp[A[j]]+1 to the answer. Also you would have to take the modulo of results repeated throughout the whole process.
This is a 3 state dp problem where the states should be as follows:- (a) Index up to which str has been processed, (b) Value of the new str mod n and (c) Flag value z which stores whether a bit smaller than the bit str has been used or not till now. Overall complexity is (10000*100*2)*100 as there are 100 distinct possible mod values which will pass the time. Here is the AC Code : http://paste.ubuntu.com/24223122/
This problem could be solved with the natural approach involving a little bit of dynamic programming (basically memorization).
First, denote X as the decimal value of the bit-string. The number of bit-strings smaller than or equal to X which are divisible by n is simply the integer part of the division X / n, which is (X — r) / n, where r is the remainder part of the division X / n.
As we only need the answer in module MOD = 1000000007, we would need to compute X % MOD, r % MOD and 1/n % MOD (the inverse modulo of n in modulo MOD).
X % MOD could be computed in O(Nlog(N)), as X could be represented as a sum of power of 2, and each power of 2 can be computed in O(log(N)).
r % MOD is dependent on n. Thus for each n, we compute its r % MOD. This pre-computation takes O(Nn).
1/n % MOD is also computed for each n. This pre-computation takes O(nlog(MOD)).
Then, we can answer each query in O(1) time complexity with the formula (X — r) / n.
The overall complexity would therefore be O(q + Nlog(N) + Nn + nlog(MOD)), which is at most around 10^6 iterations.
You could also just use Python and preprocess all queries.