AT
Size: a a a
AT
CD
class Solution {
public:
double acc = 0;
double err = 1;
void push_randk(int x, int k) {
err = err / k;
acc += err * x;
}
int pull_randk(int k) {
double left = acc * k;
double right = (acc + err) * k;
int left_n = static_cast<int>(left);
int right_n = static_cast<int>(right);
if (left_n != right_n)
return -1;
acc = acc * k - left_n;
err = err * k;
return left_n;
}
int rand10() {
for (;;) {
if (auto x = pull_randk(10); x != -1)
return x + 1;
push_randk(rand7() - 1, 7);
}
}
};
вот это по понятным причинам работает, да?CD
CD
AT
CD
AT
CD
AT
CD
CD
CD
class Solution {
public:
double acc = 0;
double err = 1;
void push_randk(int x, int k) {
err = err / k;
acc += err * x;
}
int pull_randk(int k) {
double left = acc * k;
double right = (acc + err) * k;
int left_n = static_cast<int>(left);
int right_n = static_cast<int>(right);
if (left_n != right_n)
return -1;
acc = acc * k - left_n;
err = err * k;
return left_n;
}
int rand10() {
for (;;) {
if (auto x = pull_randk(10); x != -1)
return x + 1;
push_randk(rand7() - 1, 7);
}
}
};
вот это по понятным причинам работает, да?CD
AT
AM
AD
DZ
С
EZ
AT