def getOstatokLIFO(df):
stack = [];
for index, row in df.iterrows():
if row.operation == "in":
stack.append([row.price, row.quantity])
continue
left = row.quantity
while left > 0:
if left >= stack[-1][1]:
left -= stack[-1][1]
stack.pop()
else:
stack[-1][1] -= left
left = 0
return stack
(floor(N/G)!)^G*(floor(N/G)+1)^(N%G)
(где G - этот самый наибольший общий делитель всех P, увеличенных на 1).6
13
22
36
55
82
117
163
219
289
375
484
623
800
1024
1300
1651
2090
2643
3333
vector<int> ConvexHull(vector<double> x, vector<double> y) {
int first = ...; // Тут поиск самой нижней-левой точки.
const int n = x.size();
int cur = first;
vector<int> ans{first};
// Текущий вектор стороны может идти вправо от самой нижней точки.
double side_x = 1;
double side_y = 0;
while (true) {
int bsti = -1;
// Вектор на лучшую точку.
double bst_x = 0;
double bst_y = 0;
// Расстояние до нее.
double bst_dist = 0;
for (i = 0; i < n; ++i) {
if (i == cur) continue;
// Вектор на текущую точку.
double cur_x = x[i] - x[cur];
double cur_y = y[i] - y[cur];
// Отсекаем точки назад вдоль оболочки на той же стороне.
// Можно заменить пометкой в bool in_hull[],
// которая ставится при добавлении точки в ответ (ans).
if (side_x*cur_y-side_y*cur_x == 0 && side_x*cur_x+side_y*cur_y < 0) continue;
double vec = bst_x*cur_y-bst_y*cur_x;
double dist = cur_x*cur_x+cur_y*cur_y;
// Берем точку, если она правее текущего кандидата. Или на той же прямой, но ближе.
if (bsti == -1 || vec < 0 || (vec == 0 && dist < bst_dist)) {
bsti = i;
bst_dist = dist;
bst_x = cur_x;
bst_y = cur_y;
}
}
// Сделали полный оборот.
if (bsti == first) break;
side_x = bst_x;
side_y = bst_y;
and.push_back(bsti);
cur = bsti;
}
return ans;
}
(g^m mod n^2) * (r^n mod n^2) mod n^2
nn = n.multiply(n);
res = g.modPow(m, nn).multiply(r.modPow(n, nn)).mod(nn);
bcabc
состоит из подстроки bc
и одного префикса abc
.currentByte & (1 << (7-j))
, то должно работать почти также быстро.