MTUCI ICPC
Матричное умножение
void matmul(const vector<vector<int>>& a,
const vector<vector<int>>& b,
vector<vector<int>>& c){
for (int i=0;i<a.size();++i){
for (int j=0;j<b[0].size();++j){
for (int k=0;k<b.size();++k){
c[i][j]+=a[i][k]*b[k][j];
}
}
}
return;
}Равномерное увеличение в n раз:
Перемена координат местами:
Матрица поворота:
Единичная матрица:
Вычисление n-ого числа Фиббоначи:
Поиск k-цикла в графе
Рекуррентные формулы в общем виде
Список операций:
Цель:
void gauss(vector<vector<double>>& a,
vector<double>& b){
for (int i=0;i<a.size();++i){
double cc = 1/a[i][i];
b[i]*=cc;
for (int j=0;j<a.size();j++){
a[i][j]*=cc;
}
for (int j=0;j<a.size();j++){
double c2 = a[j][i];
if (j!=i){
b[j]-=c2*b[i];
for (int k=0;k<a.size();++k){
a[j][k]-=c2*a[i][k];
}
}
}
}
return;
}Суть интерполяции
Как считать:
Как хранить?
vector<int> digits a; //разряды нашего числа
int base = 10; // может быть любой
// 123459 = {9,5,4,3,2,1}
1 000 000 000 000 = [1000][0]_1e9Как складывать? По разрядам, а потом
const int base = 10;
vector<int> normalize(vector<int> a) {
int carry = 0;
for (int &x : a) {
x += carry;
carry = x / base;
x %= base;
}
while (carry > 0) {
a.push_back(carry % base);
carry /= base;
}
return a;
}
Алгоритм Карацубы:
Расширенный алгоритм Евклида
С помощью алгоритма Евклида:
Малая теорема Ферма (для простого модуля)
Теорема Эйлера (для любого модуля)
Общий вид уравнения:
Еще раз взглянем на расширенный алгоритм Евклида:
Решение:
База алгоритма - парадокс дня рождения
Наша "случайная" функция:
Буква Ро на функциональном графе
define long long ll;
inline ll f(ll x, ll n) { return (__int128_t) (x + 1) * (x + 1) % n; }
ll find_divisor(ll n, ll seed = 1) {
ll x = seed, y = seed;
ll d = 1;
while (d == 1 || d == n) {
// двигаем первый указатель на шаг
y = f(y);
// а второй -- на два
x = f(f(x));
// пытаемся найти общий делитель
d = gcd(abs(x - y), n);
}
return d;
}Вы устроились на работу в крупную IT компанию, но, придя в офис, обнаружили, что лифт едет на случайные этажи с определенными вероятностями перехода. Как узнать распределение вероятности этажа, на котором вы окажетесь после k-поездок на этом лифте?
int calc(int n, int p){
int res=1;
int t=1;
while(n>1){
if (n/p%2){
t = p - 1;
}
else{
t = 1
};
res = res * t % p;
for (int i=2;i<=n%p;++i){
res = res * i % p;
}
n/=p;
}
return res % p;
}