/* Potyczki Algorytmiczne 2021 Runda 3 B Mopadulo (MOP) tsz */ #include <assert.h> #include <ctype.h> #include <limits.h> #include <math.h> #include <memory.h> #include <stdint.h> #include <stdlib.h> #include <stdio.h> #include <algorithm> #ifndef TSDEBUG #define NDEBUG 1 #endif #ifdef __MINGW32__ #define FMTU64 "I64u" #define FMTI64 "I64d" #else #define FMTU64 "llu" #define FMTI64 "lld" #endif typedef int16_t i16; typedef int32_t i32; typedef int64_t i64; typedef uint64_t u64; inline i32 Min(i32 a, i32 b) { return a <= b ? a : b; } inline i32 Max(i32 a, i32 b) { return a >= b ? a : b; } const i32 MinLiczbaLiczb = 1; const i32 MaxLiczbaLiczb = 300000; const i64 Mop = 1000000007; const i32 MinLiczba = 1; const i32 MaxLiczba = Mop - 1; i32 Liczby[MaxLiczbaLiczb + 1] = {0}; i32 LiczbyPodzialowMop[MaxLiczbaLiczb + 1] = {0}; int main() { i32 LiczbaLiczb = 0; scanf("%d\n", &LiczbaLiczb); assert(MinLiczbaLiczb <= LiczbaLiczb); assert(LiczbaLiczb <= MaxLiczbaLiczb); for (i32 i = 1; i <= LiczbaLiczb; i++) { scanf("%d", &Liczby[i]); assert(MinLiczba <= Liczby[i]); assert(Liczby[i] <= MaxLiczba); } LiczbyPodzialowMop[0] = 1; for (i32 i = 1; i <= LiczbaLiczb; i++) { i32 LiczbaPodzialow = 0; i32 Liczba = Liczby[i]; if (!(Liczba & 1)) { LiczbaPodzialow = LiczbyPodzialowMop[i - 1]; } for (i32 j = i - 1; j >= 1; j--) { Liczba = (Liczba + Liczby[j]) % Mop; if (!(Liczba & 1)) { LiczbaPodzialow = (LiczbaPodzialow + LiczbyPodzialowMop[j - 1]) % Mop; } } LiczbyPodzialowMop[i] = LiczbaPodzialow; } printf("%d\n", LiczbyPodzialowMop[LiczbaLiczb]); return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | /* Potyczki Algorytmiczne 2021 Runda 3 B Mopadulo (MOP) tsz */ #include <assert.h> #include <ctype.h> #include <limits.h> #include <math.h> #include <memory.h> #include <stdint.h> #include <stdlib.h> #include <stdio.h> #include <algorithm> #ifndef TSDEBUG #define NDEBUG 1 #endif #ifdef __MINGW32__ #define FMTU64 "I64u" #define FMTI64 "I64d" #else #define FMTU64 "llu" #define FMTI64 "lld" #endif typedef int16_t i16; typedef int32_t i32; typedef int64_t i64; typedef uint64_t u64; inline i32 Min(i32 a, i32 b) { return a <= b ? a : b; } inline i32 Max(i32 a, i32 b) { return a >= b ? a : b; } const i32 MinLiczbaLiczb = 1; const i32 MaxLiczbaLiczb = 300000; const i64 Mop = 1000000007; const i32 MinLiczba = 1; const i32 MaxLiczba = Mop - 1; i32 Liczby[MaxLiczbaLiczb + 1] = {0}; i32 LiczbyPodzialowMop[MaxLiczbaLiczb + 1] = {0}; int main() { i32 LiczbaLiczb = 0; scanf("%d\n", &LiczbaLiczb); assert(MinLiczbaLiczb <= LiczbaLiczb); assert(LiczbaLiczb <= MaxLiczbaLiczb); for (i32 i = 1; i <= LiczbaLiczb; i++) { scanf("%d", &Liczby[i]); assert(MinLiczba <= Liczby[i]); assert(Liczby[i] <= MaxLiczba); } LiczbyPodzialowMop[0] = 1; for (i32 i = 1; i <= LiczbaLiczb; i++) { i32 LiczbaPodzialow = 0; i32 Liczba = Liczby[i]; if (!(Liczba & 1)) { LiczbaPodzialow = LiczbyPodzialowMop[i - 1]; } for (i32 j = i - 1; j >= 1; j--) { Liczba = (Liczba + Liczby[j]) % Mop; if (!(Liczba & 1)) { LiczbaPodzialow = (LiczbaPodzialow + LiczbyPodzialowMop[j - 1]) % Mop; } } LiczbyPodzialowMop[i] = LiczbaPodzialow; } printf("%d\n", LiczbyPodzialowMop[LiczbaLiczb]); return 0; } |