Niestety, nie byliśmy w stanie w pełni poprawnie wyświetlić tego pliku, ponieważ nie jest zakodowany w UTF-8.
Możesz pobrać ten plik i spróbować otworzyć go samodzielnie.
#include <iostream> #define MOD 1000000007 using namespace std; void processCaseWhenSumIsLessThanMod(int *tab, int *res, int n) { int *resprim = new int[n]; res[0] = (tab[0] & 1) ? 0 : 1; // liczba podzia��w mopadulo resprim[0] = (tab[0] & 1) ? 1 : 0; // liczba podzia��w, w kt�rych tylko ostatni nie jest mopadulo for (int i=1;i<n;++i) { if (tab[i] & 1) // nieparzyste { res[i] = resprim[i-1]; resprim[i] = (2 * res[i-1]) % MOD; } else // parzyste { res[i] = (2 * res[i-1]) % MOD; resprim[i] = resprim[i-1]; } } cout << res[n-1] << endl; delete[] resprim; } int main() { int n; cin >> n; int *tab = new int[n]; int *sums = new int[n+1]; int *res = new int[n]; long long sum = 0; sums[0] = 0; for (int i=0;i<n;++i) { cin >> tab[i]; sums[i+1] = (sums[i] + tab[i]) % MOD; sum += tab[i]; } if (sum < MOD) { processCaseWhenSumIsLessThanMod(tab,res,n); delete[] tab; delete[] sums; delete[] res; return 0; } res[0] = (tab[0] & 1) ? 0 : 1; for (int i=1;i<n;++i) { res[i] = (sums[i+1] & 1) ? 0 : 1; for (int j=0;j<i;++j) { int s = sums[i+1]-sums[j+1]; if (s < 0) s += MOD; if (!(s & 1)) res[i] = (res[i] + res[j]) % MOD; } } cout << res[n-1] << endl; delete[] tab; delete[] sums; delete[] res; 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 | #include <iostream> #define MOD 1000000007 using namespace std; void processCaseWhenSumIsLessThanMod(int *tab, int *res, int n) { int *resprim = new int[n]; res[0] = (tab[0] & 1) ? 0 : 1; // liczba podzia��w mopadulo resprim[0] = (tab[0] & 1) ? 1 : 0; // liczba podzia��w, w kt�rych tylko ostatni nie jest mopadulo for (int i=1;i<n;++i) { if (tab[i] & 1) // nieparzyste { res[i] = resprim[i-1]; resprim[i] = (2 * res[i-1]) % MOD; } else // parzyste { res[i] = (2 * res[i-1]) % MOD; resprim[i] = resprim[i-1]; } } cout << res[n-1] << endl; delete[] resprim; } int main() { int n; cin >> n; int *tab = new int[n]; int *sums = new int[n+1]; int *res = new int[n]; long long sum = 0; sums[0] = 0; for (int i=0;i<n;++i) { cin >> tab[i]; sums[i+1] = (sums[i] + tab[i]) % MOD; sum += tab[i]; } if (sum < MOD) { processCaseWhenSumIsLessThanMod(tab,res,n); delete[] tab; delete[] sums; delete[] res; return 0; } res[0] = (tab[0] & 1) ? 0 : 1; for (int i=1;i<n;++i) { res[i] = (sums[i+1] & 1) ? 0 : 1; for (int j=0;j<i;++j) { int s = sums[i+1]-sums[j+1]; if (s < 0) s += MOD; if (!(s & 1)) res[i] = (res[i] + res[j]) % MOD; } } cout << res[n-1] << endl; delete[] tab; delete[] sums; delete[] res; return 0; } |