Skip to content

Commit d4a91cc

Browse files
committed
Add Lagrange Interpolation and modular int class
Added one test
1 parent cf20ffd commit d4a91cc

File tree

4 files changed

+170
-1
lines changed

4 files changed

+170
-1
lines changed

code/data-structures/seg_tree_lazy_prop.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
#include "../c++/template.cpp"
21
const int N = 1e5 + 10;
32
int t[N << 2], lazy[N << 2];
43
struct stree{
@@ -12,6 +11,14 @@ struct stree{
1211
lazy[v] = 0;
1312
}
1413
}
14+
void build(int v, int tl, int tr, vi& a){
15+
if(tl == tr){
16+
t[v] = a[tl]; return;
17+
}
18+
int tm = (tl + tr) >> 1;
19+
build(v << 1, tl, tm, a), build((v << 1) | 1, tm+1, tr, a);
20+
t[v] = oper(t[v << 1], t[(v << 1) | 1]);
21+
}
1522
void upd(int v, int tl, int tr){
1623
if(tl > r || tr < l) return;
1724
if(l <= tl && tr <= r){
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
// https://codeforces.com/gym/104505/problem/A
2+
#include <bits/stdc++.h>
3+
using namespace std;
4+
5+
#define forn(i,n) for(int i=0; i<n; ++i)
6+
#define for1(i,n) for(int i=1; i<=n; ++i)
7+
#define fore(i,l,r) for(int i=l; i<=r; ++i)
8+
#define fored(i,l,r) for(int i=r; i>=l; --i)
9+
#define el '\n'
10+
#define sz(v) int(v.size())
11+
12+
typedef long long ll;
13+
const int mod = 1e9 + 7;
14+
template <class T>
15+
T bpow(T b, int e) {
16+
T a(1);
17+
do{
18+
if(e & 1) a *= b;
19+
b *= b;
20+
}while(e >>= 1);
21+
return a;
22+
}
23+
struct mint {
24+
int x;
25+
mint(): x(0){}
26+
mint(ll v) : x((v % mod + mod) % mod) {} // be careful of negative numbers!
27+
// Helpers to shorten code
28+
#define add(a, b) a + b >= mod ? a + b - mod : a + b
29+
#define sub(a, b) a < b ? a + mod - b : a - b
30+
#define yo *this
31+
#define cmint const mint&
32+
33+
mint &operator += (cmint o) { return x = add(x, o.x), yo; }
34+
mint &operator -= (cmint o) { return x = sub(x, o.x), yo; }
35+
mint &operator *= (cmint o) { return x = ll(x) * o.x % mod, yo; }
36+
mint &operator /= (cmint o) { return yo *= bpow(o, mod-2); }
37+
38+
mint operator + (cmint b) const { return mint(yo) += b; }
39+
mint operator - (cmint b) const { return mint(yo) -= b; }
40+
mint operator * (cmint b) const { return mint(yo) *= b; }
41+
mint operator / (cmint b) const { return mint(yo) /= b; }
42+
43+
mint operator - () const { return mint() - mint(yo); }
44+
bool operator == (cmint b) const { return x == b.x; }
45+
bool operator != (cmint b) const { return x != b.x; }
46+
47+
friend ostream& operator << (ostream &os, cmint p) { return os << p.x; }
48+
friend istream& operator >> (istream &is, mint &p) { return is >> p.x; }
49+
};
50+
51+
const int N = 1e6;
52+
mint f[N], fr[N];
53+
void initC(){
54+
if(f[0] == 1) return; // Already precalculated
55+
f[0] = 1;
56+
for1(i, N-1) f[i] = f[i-1] * i;
57+
fr[N-1] = bpow(f[N-1], mod-2);
58+
fored(i, 1, N-1) fr[i-1] = fr[i] * i;
59+
}
60+
struct LagrangePol {
61+
int n;
62+
vector<mint> y, den, l, r;
63+
LagrangePol(vector<mint> f): n(sz(f)), y(f), den(n), l(n), r(n){// f[i] := f(i)
64+
// Calcula interpol. pol P in O(n) := deg(P) = sz(v)-1
65+
initC();
66+
forn(i, n) {
67+
den[i] = fr[n-1-i] * fr[i];
68+
if((n-1-i) & 1) den[i] = -den[i];
69+
}
70+
}
71+
mint eval(mint x){ // Evaluate LagrangePoly P(x) in O(n)
72+
l[0] = r[n-1] = 1;
73+
for1(i, n-1) l[i] = l[i-1] * (x - i + 1);
74+
fored(i, 0, n-2) r[i] = r[i+1] * (x - i - 1);
75+
mint ans = 0;
76+
forn(i, n) ans += l[i] * r[i] * y[i] * den[i];
77+
return ans;
78+
}
79+
};
80+
81+
int main() {
82+
ios_base::sync_with_stdio(0); cin.tie(0);
83+
mint n; int k;
84+
cin >> n >> k;
85+
vector<mint> num(2*k + 10);
86+
auto den = num;
87+
for1(i, sz(num)-1) {
88+
num[i] = num[i-1] + bpow(mint(i), k) * bpow(n-i+1, k);
89+
den[i] = den[i-1] + bpow(n-i+1, k);
90+
}
91+
LagrangePol p_num(num), p_den(den);
92+
cout << p_num.eval(n) / p_den.eval(n) << el;
93+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
#include "mint.cpp"
2+
const int N = 1e6;
3+
mint f[N], fr[N];
4+
void initC(){
5+
if(f[0] == 1) return; // Already precalculated
6+
f[0] = 1;
7+
for1(i, N-1) f[i] = f[i-1] * i;
8+
fr[N-1] = bpow(f[N-1], mod-2);
9+
fored(i, 1, N-1) fr[i-1] = fr[i] * i;
10+
}
11+
// mint C(int n, int k) { return k<0 || k>n ? 0 : f[n] * fr[k] * fr[n-k]; }
12+
struct LagrangePol {
13+
int n;
14+
vector<mint> y, den, l, r;
15+
LagrangePol(vector<mint> f): n(sz(f)), y(f), den(n), l(n), r(n){// f[i] := f(i)
16+
// Calcula interpol. pol P in O(n) := deg(P) = sz(v)-1
17+
initC();
18+
forn(i, n) {
19+
den[i] = fr[n-1-i] * fr[i];
20+
if((n-1-i) & 1) den[i] = -den[i];
21+
}
22+
}
23+
mint eval(mint x){ // Evaluate LagrangePoly P(x) in O(n)
24+
l[0] = r[n-1] = 1;
25+
for1(i, n-1) l[i] = l[i-1] * (x - i + 1);
26+
fored(i, 0, n-2) r[i] = r[i+1] * (x - i - 1);
27+
mint ans = 0;
28+
forn(i, n) ans += l[i] * r[i] * y[i] * den[i];
29+
return ans;
30+
}
31+
};

code/math/mint.cpp

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
typedef long long ll;
2+
const int mod = 1e9 + 7;
3+
template <class T>
4+
T bpow(T b, int e) {
5+
T a(1);
6+
do{
7+
if(e & 1) a *= b;
8+
b *= b;
9+
}while(e >>= 1);
10+
return a;
11+
}
12+
struct mint {
13+
int x;
14+
mint(): x(0){}
15+
mint(ll v) : x((v % mod + mod) % mod) {} // be careful of negative numbers!
16+
// Helpers to shorten code
17+
#define add(a, b) a + b >= mod ? a + b - mod : a + b
18+
#define sub(a, b) a < b ? a + mod - b : a - b
19+
#define yo *this
20+
#define cmint const mint&
21+
22+
mint &operator += (cmint o) { return x = add(x, o.x), yo; }
23+
mint &operator -= (cmint o) { return x = sub(x, o.x), yo; }
24+
mint &operator *= (cmint o) { return x = ll(x) * o.x % mod, yo; }
25+
mint &operator /= (cmint o) { return yo *= bpow(o, mod-2); }
26+
27+
mint operator + (cmint b) const { return mint(yo) += b; }
28+
mint operator - (cmint b) const { return mint(yo) -= b; }
29+
mint operator * (cmint b) const { return mint(yo) *= b; }
30+
mint operator / (cmint b) const { return mint(yo) /= b; }
31+
32+
mint operator - () const { return mint() - mint(yo); }
33+
bool operator == (cmint b) const { return x == b.x; }
34+
bool operator != (cmint b) const { return x != b.x; }
35+
36+
friend ostream& operator << (ostream &os, cmint p) { return os << p.x; }
37+
friend istream& operator >> (istream &is, mint &p) { return is >> p.x; }
38+
};

0 commit comments

Comments
 (0)