Submission #491080

#TimeUsernameProblemLanguageResultExecution timeMemory
491080rainboyLjetopica (COI19_ljetopica)C11
100 / 100
65 ms304 KiB
#include <stdio.h> #include <string.h> #define N 1000 #define MD 1000000007 int pp2[N + 1]; void init() { int i; pp2[0] = 1; for (i = 1; i <= N; i++) pp2[i] = pp2[i - 1] * 2 % MD; } int solve(char *aa, char *cc, int n, int k, int lt) { static char bb[N + 1]; static int dp[N + 1][2], dq[N + 1][2]; int i, j; bb[0] = '1'; for (i = 0; i < n - 1; i++) bb[i + 1] = cc[i] == 'L' ? '0' : '1'; for (j = 0; j <= k; j++) dp[j][0] = dp[j][1] = 0, dq[j][0] = dq[j][1] = 0; dp[0][0] = 1, dq[0][0] = 0; for (i = 0; i < n; i++) { int a = aa[i] - '0', b = bb[i] - '0'; for (j = k; j >= 0; j--) { int x0 = dp[j][0], y0 = dq[j][0], x1 = dp[j][1], y1 = dq[j][1], b_; dp[j][0] = dp[j][1] = dq[j][0] = dq[j][1] = 0; b_ = b ^ j % 2; if (b_ != a) { dp[j][1] = (dp[j][1] + x1) % MD; dq[j][1] = (dq[j][1] + y1 + (long long) pp2[n - 1 - i] * x1 % MD * b_) % MD; if (b_ < a) { dp[j][1] = (dp[j][1] + x0) % MD; dq[j][1] = (dq[j][1] + y0 + (long long) pp2[n - 1 - i] * x0 % MD * b_) % MD; } } else { dp[j][0] = (dp[j][0] + x0) % MD; dq[j][0] = (dq[j][0] + y0 + (long long) pp2[n - 1 - i] * x0 % MD * b_) % MD; dp[j][1] = (dp[j][1] + x1) % MD; dq[j][1] = (dq[j][1] + y1 + (long long) pp2[n - 1 - i] * x1 % MD * b_) % MD; } if (j < k) { b_ = b ^ (j + 1) % 2; if (b_ != a) { dp[j + 1][1] = (dp[j + 1][1] + x1) % MD; dq[j + 1][1] = (dq[j + 1][1] + y1 + (long long) pp2[n - 1 - i] * x1 % MD * b_) % MD; if (b_ < a) { dp[j + 1][1] = (dp[j + 1][1] + x0) % MD; dq[j + 1][1] = (dq[j + 1][1] + y0 + (long long) pp2[n - 1 - i] * x0 % MD * b_) % MD; } } else { dp[j + 1][0] = (dp[j + 1][0] + x0) % MD; dq[j + 1][0] = (dq[j + 1][0] + y0 + (long long) pp2[n - 1 - i] * x0 % MD * b_) % MD; dp[j + 1][1] = (dp[j + 1][1] + x1) % MD; dq[j + 1][1] = (dq[j + 1][1] + y1 + (long long) pp2[n - 1 - i] * x1 % MD * b_) % MD; } } } } return (dq[k][1] + (lt ? 0 : dq[k][0])) % MD; } int main() { static char cc[N + 1], aa[N + 1], bb[N + 1]; int n, k, i, ans; init(); scanf("%d%d%s%s%s", &n, &k, cc, aa, bb); ans = (solve(bb, cc, n, k, 0) - solve(aa, cc, n, k, 1)) % MD; for (i = 0; i < n - 1; i++) cc[i] = cc[i] == 'L' ? 'R' : 'L'; ans = ((long long) ans + solve(bb, cc, n, k, 0) - solve(aa, cc, n, k, 1)) % MD; if (ans < 0) ans += MD; printf("%d\n", ans); return 0; }

Compilation message (stderr)

ljetopica.c: In function 'main':
ljetopica.c:75:2: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   75 |  scanf("%d%d%s%s%s", &n, &k, cc, aa, bb);
      |  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...