Submission #544605

#TimeUsernameProblemLanguageResultExecution timeMemory
544605rainboyPalindrome-Free Numbers (BOI13_numbers)C11
100 / 100
1 ms340 KiB
#include <stdio.h> #define L 19 #define D 10 long long dp[L + 1][D][D]; void init() { int l, d1, d2, d3; for (d1 = 0; d1 < D; d1++) for (d2 = 0; d2 < D; d2++) if (d1 != d2) dp[2][d1][d2] = 1; for (l = 2; l < L; l++) for (d1 = 0; d1 < D; d1++) for (d2 = 0; d2 < D; d2++) { long long x = dp[l][d1][d2]; if (x == 0) continue; for (d3 = 0; d3 < D; d3++) if (d3 != d1 && d3 != d2) dp[l + 1][d2][d3] += x; } } long long solve(long long n) { static int dd[L]; int l, i, d1, d2; long long ans; if (n <= 10) return n; l = 0; while (n > 0) { dd[l++] = n % 10; n /= 10; } ans = 10; for (i = 2; i < l; i++) for (d1 = 0; d1 < D; d1++) for (d2 = 1; d2 < D; d2++) ans += dp[i][d1][d2]; for (i = l - 1; i >= 0; i--) if (i == l - 1) for (d2 = 1; d2 < dd[i]; d2++) for (d1 = 0; d1 < D; d1++) ans += dp[i + 1][d1][d2]; else { d2 = dd[i + 1]; for (d1 = 0; d1 < dd[i]; d1++) if (i + 2 == l || d1 != dd[i + 2]) ans += dp[i + 2][d1][d2]; if (dd[i] == dd[i + 1] || i + 2 < l && dd[i] == dd[i + 2]) break; } return ans; } int main() { long long l, r; init(); scanf("%lld%lld", &l, &r); printf("%lld\n", solve(r + 1) - solve(l)); return 0; }

Compilation message (stderr)

numbers.c: In function 'solve':
numbers.c:55:40: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
   55 |    if (dd[i] == dd[i + 1] || i + 2 < l && dd[i] == dd[i + 2])
      |                              ~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~
numbers.c: In function 'main':
numbers.c:65:2: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   65 |  scanf("%lld%lld", &l, &r);
      |  ^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...