Se dă o expresie matematică în care pot să apară literele x
, y
, z
, t
, cifre și semnele +
sau -
.
Se dă o expresie matematică în care pot să apară literele x
, y
, z
, t
, cifre și semnele +
sau -
.
Cifrele alăturate formează numere. Literele reprezintă variabile. O variabilă poate fi precedată de un număr. Între variabilă și numărul care o precede nu există alte caractere. Un grup format dintr-o literă și, eventual, un număr care o precede formează un monom. Un monom nu conține mai multe litere. Numărul care apare într-un monom se numește coeficient.
Expresia poate să conțină și numere care nu sunt urmate de o variabilă. Aceste numere se numesc termeni liberi.
Expresia este deci alcătuită din monoame și termeni liberi. Fiecare monom și fiecare termen liber este precedat de unul dintre semnele +
sau -
.
Exemple:
Expresii corecte:
-x+100
+3x+2y-3z+7x-15-3+8z-7y
+10x-7y+3x-7+5z-8t-z-x-y+3
Expresii incorecte:
x+100
(x
nu este precedat de +
sau -
)
+x+y-3zt
(3zt
nu este monom, deoarece conţine două litere)
-x + y -34*t + 5z - 5u
(în expresie apar caractere nepermise, în acest caz spații, litera u
și semnul *
)
Valoarea matematică a unei expresii este valoarea care se obține dacă înlocuim literele care apar în expresie cu valori numerice și efectuăm calculele. Valoarea unui monom se obține înmulțind coeficientul monomului cu valoarea pe care o are variabila care apare în respectivul monom. De exemplu, valoarea expresiei +3x
pentru x=2
este 6
.
Cerința
Fiind dată o expresie corectă, să se determine:
1. valoarea matematică a expresiei dacă x
, y
, z
și t
au valoarea 1
.
2. numărul de cvartete distincte (x,y,z,t)
, de valori întregi care aparțin unui interval dat [a,b]
, pentru care expresia matematică corespunzătoare expresiei date este egală cu o valoare dată E
. Două cvartete sunt distincte dacă există cel puţin o poziţie pentru care valorile corespunzătoare sunt diferite.
Date de intrare
Datele de intrare se citesc din fişierul eq4.in
, care are următoarea structură:
– pe prima linie se află numărul natural C
, care poate fi egal cu 1
sau 2
, în funcţie de cerinţa ce trebuie rezolvată;
– pe a doua linie se află expresia dată;
– pe a treia linie se află valorile a b E
, separate prin câte un spațiu.
Date de ieșire
Datele de ieşire se vor scrie în fişierul eq4.out
astfel:
– Dacă C=1
, pe prima linie se va scrie răspunsul la cerința 1;
– Dacă C=2
, pe prima linie se va scrie răspunsul la cerința 2.
Restricții și precizări
- coeficienţii sunt numere naturale, având cel mult
4
cifre 2 ≤ lungimea expresiei ≤ 100000
-500 ≤ a ≤ b ≤ 500
-10
15
≤ E ≤ 10
15
- Testele care au
C=1
totalizează20
de puncte; - Testele care au
C=2
totalizează70
de puncte; - În cel puțin
30%
dintre teste, în expresia dată apar cel mult trei dintre literelex
,y
,z
saut
. - În concurs s-au acordat
10
puncte din oficiu. Aici se acordă10
puncte pentru exemplele din enunț.
Exemplul 1:
eq4.in
1 +10x-7y+3x-7+5z-8t-z-x-y+3 -1 1 0
eq4.out
-4
Explicație
Se rezolvă cerința 1. Valoarea expresiei este: 10-7+3-7+5-8-1-1-1+3 = -4
.
Exemplul 2:
eq4.in
1 -x+1 -1 1 0
eq4.out
0
Explicație
Se rezolvă cerința 1. Valoarea expresiei este -1+1 = 0
.
Exemplul 3:
eq4.in
2 +10x-7y+3x-7+5z-8t-z-x-y+3 -1 1 0
eq4.out
8
Explicație
Se rezolvă cerința 2. Sunt 8
cvartete: (-1,-1,0,-1)
, (0,-1,-1,0)
, (0,-1,1,1)
, (0,0,-1,-1)
, (0,0,1,0)
, (0,1,1,-1)
, (1,0,0,1)
, (1,1,0,0)
pentru care expresia este egală cu 0
.
Exemplul 4:
eq4.in
2 -x+1+0z -1 1 0
eq4.out
27
Explicație
Se rezolvă cerința 2. Sunt 27
cvartete: (1,-1,-1,-1)
, (1,-1,-1,0)
, (1,-1,-1,1)
, (1,-1,0,-1)
, (1,-1,0,0)
, (1,-1,0,1)
etc. pentru care expresia este egala cu 0
.
#include <bits/stdc++.h> using namespace std; ifstream cin("eq4.in"); ofstream cout("eq4.out"); int cer , a , b , cx , cz , ct , cy , c; long long A[1002002] , B[1002002] , p1 , p2 , e; string s; int cb_min(long long a[] , int n , long long v) { int st = 1 , dr = n , m; while (st <= dr) { m = (st + dr) / 2; if (a[m] >= v) dr = m - 1; else st = m + 1; } return st; } int cb_max(long long a[] , int n , long long v) { int st = 1 , dr = n , m; while (st <= dr) { m = (st + dr) / 2; if (a[m] <= v) st = m + 1; else dr = m - 1; } return dr; } int main() { cin >> cer >> s >> a >> b >> e; int i = 0; while(s.length()) { int i = 0 , nr = 0 , semn; if(s[i] == '+') semn = 1; else semn = -1; i++; while(isdigit(s[i])) { nr = nr * 10 + s[i] - '0'; i++; } if(nr == 0 && s[i - 1] != '0') nr = 1; if(s[i] == 'x') cx = cx + semn * nr; else if(s[i] == 'y') cy = cy + semn * nr; else if(s[i] == 'z') cz = cz + semn * nr; else if(s[i] == 't') ct = ct + semn * nr; else c = c + semn * nr , i--; if(i + 1 <= s.length()) s = s.substr(i + 1); else s = ""; } //cout << cx << " " << cy << " " << cz << " " << ct << " " << c <<'\n'; if(cer == 1) cout << cx + cy + cz + ct + c; else { for(int i = a ; i <= b ; i++) for(int j = a ; j <= b ; j++) { A[++p1] = cz * i + ct * j + c; B[++p2] = e - cx * i - cy * j; } sort(A + 1 , A + p1 + 1); int nrs = 0; for(int i = 1 ; i <= p2 ; i++) if(A[cb_max(A , p1 , B[i])] == B[i]) nrs = nrs + cb_max(A , p1 , B[i]) - cb_min(A , p1 , B[i]) + 1; cout << nrs; } }