Skip to content

Commit 7b1bb7f

Browse files
committed
Adding snippets for code used in mathematical problems
1 parent 973c96e commit 7b1bb7f

File tree

6 files changed

+390
-0
lines changed

6 files changed

+390
-0
lines changed

mathematics/bigInt.sublime-snippet

Lines changed: 186 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,186 @@
1+
<snippet>
2+
<content><![CDATA[
3+
struct bigint{
4+
static const int LEN = 60;
5+
static const int BIGMOD = 10000;
6+
7+
int s; // sign of big integer
8+
int vl, v[LEN]; // vl is length of v array
9+
10+
bigint() : s(1) { vl = 0; } // eg. bigint x;
11+
12+
bigint(long long a) { // eg. bigint x(a);
13+
s = 1; vl = 0;
14+
if (a < 0) { s = -1; a = -a; }
15+
while (a) {
16+
push_back(a % BIGMOD);
17+
a /= BIGMOD;
18+
}
19+
}
20+
21+
bigint(string str) { // eg. bigint x(str);
22+
s = 1; vl = 0;
23+
int stPos = 0, num = 0;
24+
if (!str.empty() && str[0] == '-') {
25+
stPos = 1;
26+
s = -1;
27+
}
28+
for (int i=str.length()-1, q=1; i>=stPos; i--) {
29+
num += (str[i] - '0') * q;
30+
if ((q *= 10) >= BIGMOD) {
31+
push_back(num);
32+
num = 0; q = 1;
33+
}
34+
}
35+
if (num) push_back(num);
36+
}
37+
38+
int len() const {
39+
return vl;
40+
}
41+
42+
bool empty() const { return len() == 0; }
43+
44+
void push_back(int x) {
45+
v[vl++] = x;
46+
}
47+
48+
void pop_back() {
49+
vl--;
50+
51+
}
52+
53+
int back() const {
54+
return v[vl-1];
55+
}
56+
57+
void n() {
58+
while (!empty() && !back()) pop_back();
59+
}
60+
61+
void resize(int nl) {
62+
vl = nl;
63+
memset(v,0,sizeof(int)*vl);
64+
}
65+
66+
void print() const {
67+
if (empty()) { putchar('0'); return; }
68+
if (s == -1) putchar('-');
69+
printf("%d", back());
70+
for (int i=len()-2; i>=0; i--) printf("%.4d",v[i]);
71+
}
72+
73+
friend std::ostream& operator << (std::ostream& out, const bigint &a) {
74+
if (a.empty()) { out << "0"; return out; }
75+
if (a.s == -1) out << "-";
76+
out << a.back();
77+
for (int i=a.len()-2; i>=0; i--) {
78+
char str[10];
79+
snprintf(str, 5, "%.4d", a.v[i]);
80+
out << str;
81+
}
82+
return out;
83+
}
84+
85+
int compare(const bigint &b)const {
86+
if (s != b.s) return s - b.s;
87+
if (s == -1) return -(-*this).compare(-b);
88+
if (len() != b.len()) return len()-b.len();//int
89+
for (int i=len()-1; i>=0; i--)
90+
if (v[i]!=b.v[i]) return v[i]-b.v[i];
91+
return 0;
92+
}
93+
94+
bool operator < (const bigint &b)const{ return compare(b)<0; }
95+
bool operator <= (const bigint &b)const{ return compare(b)<=0; }
96+
bool operator == (const bigint &b)const{ return compare(b)==0; }
97+
bool operator != (const bigint &b)const{ return compare(b)!=0; }
98+
bool operator > (const bigint &b)const{ return compare(b)>0; }
99+
bool operator >= (const bigint &b)const{ return compare(b)>=0; }
100+
101+
bigint operator - () const {
102+
bigint r = (*this);
103+
r.s = -r.s;
104+
return r;
105+
}
106+
bigint operator + (const bigint &b) const {
107+
if (s == -1) return -(-(*this)+(-b));
108+
if (b.s == -1) return (*this)-(-b);
109+
bigint r;
110+
int nl = max(len(), b.len());
111+
r.resize(nl + 1);
112+
for (int i=0; i<nl; i++) {
113+
if (i < len()) r.v[i] += v[i];
114+
if (i < b.len()) r.v[i] += b.v[i];
115+
if(r.v[i] >= BIGMOD) {
116+
r.v[i+1] += r.v[i] / BIGMOD;
117+
r.v[i] %= BIGMOD;
118+
}
119+
}
120+
r.n();
121+
return r;
122+
}
123+
bigint operator - (const bigint &b) const {
124+
if (s == -1) return -(-(*this)-(-b));
125+
if (b.s == -1) return (*this)+(-b);
126+
if ((*this) < b) return -(b-(*this));
127+
bigint r;
128+
r.resize(len());
129+
for (int i=0; i<len(); i++) {
130+
r.v[i] += v[i];
131+
if (i < b.len()) r.v[i] -= b.v[i];
132+
if (r.v[i] < 0) {
133+
r.v[i] += BIGMOD;
134+
r.v[i+1]--;
135+
}
136+
}
137+
r.n();
138+
return r;
139+
}
140+
bigint operator * (const bigint &b) {
141+
bigint r;
142+
r.resize(len() + b.len() + 1);
143+
r.s = s * b.s;
144+
for (int i=0; i<len(); i++) {
145+
for (int j=0; j<b.len(); j++) {
146+
r.v[i+j] += v[i] * b.v[j];
147+
if(r.v[i+j] >= BIGMOD) {
148+
r.v[i+j+1] += r.v[i+j] / BIGMOD;
149+
r.v[i+j] %= BIGMOD;
150+
}
151+
}
152+
}
153+
r.n();
154+
return r;
155+
}
156+
bigint operator / (const bigint &b) {
157+
bigint r;
158+
r.resize(max(1, len()-b.len()+1));
159+
int oriS = s;
160+
bigint b2 = b; // b2 = abs(b)
161+
s = b2.s = r.s = 1;
162+
for (int i=r.len()-1; i>=0; i--) {
163+
int d=0, u=BIGMOD-1;
164+
while(d<u) {
165+
int m = (d+u+1)>>1;
166+
r.v[i] = m;
167+
if((r*b2) > (*this)) u = m-1;
168+
else d = m;
169+
}
170+
r.v[i] = d;
171+
}
172+
s = oriS;
173+
r.s = s * b.s;
174+
r.n();
175+
return r;
176+
}
177+
bigint operator % (const bigint &b) {
178+
return (*this)-(*this)/b*b;
179+
}
180+
};
181+
]]></content>
182+
<!-- Optional: Set a tabTrigger to define how to trigger the snippet -->
183+
<tabTrigger>bigint</tabTrigger>
184+
<!-- Optional: Set a scope to limit where the snippet will trigger -->
185+
<!-- <scope>source.python</scope> -->
186+
</snippet>
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
<snippet>
2+
<content><![CDATA[
3+
pair<ll,pair<ll,ll> > egcd(ll a, ll b) //solves ax + by = gcd(a,b) = g;
4+
{ //returns (g,(x,y))
5+
pair<ll,pair<ll,ll> > ret;
6+
7+
if (a==0)
8+
{
9+
ret.f = b ;
10+
ret.s.f = 0 ;
11+
ret.s.s = 1 ;
12+
}
13+
else
14+
{
15+
ll g, x, y;
16+
pair<ll,pair<ll,ll> > temp = egcd( b%a, a) ;
17+
g = temp.f;
18+
x = temp.s.f;
19+
y = temp.s.s;
20+
ret.f = g;
21+
ret.s.f = y - (b/a)*x ;
22+
ret.s.s = x;
23+
}
24+
25+
return ret;
26+
}
27+
28+
ll modinv(ll den, ll m) // den and m must be coprime
29+
{
30+
pair<ll,pair<ll,ll> > ans = egcd(den, m) ;
31+
if (ans.f == 1)
32+
{
33+
return (ans.s.f+m) % m ;
34+
}
35+
}
36+
37+
38+
ll moddiv(ll num, ll den, ll m)
39+
{
40+
return (num * modinv(den,m) ) % m ;
41+
}
42+
43+
44+
vll fact;
45+
void C( int n, ll m) // n must be less than m
46+
{
47+
fact.reserve(n+1);
48+
fact[0] = 1;
49+
vll num(n+1,1); // n*(n-1)*(n-2).....(n-k+1)
50+
for (int i = 0; i<n ; i++)
51+
{
52+
num[i+1] = (num[i]*(n-i)) % m ;
53+
}
54+
55+
vll den(n+1,1); //k!
56+
for (int i = 1; i <= n; i++)
57+
{
58+
den[i] = (den[i-1]*i) % m ;
59+
}
60+
61+
for (int i = 1; i <= n; i++)
62+
{
63+
fact[i] = moddiv(num[i], den[i], m);
64+
}
65+
}
66+
]]></content>
67+
<!-- Optional: Set a tabTrigger to define how to trigger the snippet -->
68+
<tabTrigger>binomial-big-mod</tabTrigger>
69+
<!-- Optional: Set a scope to limit where the snippet will trigger -->
70+
<!-- <scope>source.python</scope> -->
71+
</snippet>
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<snippet>
2+
<content><![CDATA[
3+
ll dp(int n, int r, ll p)
4+
{
5+
ll memo[r+1];
6+
mem(memo,0);
7+
8+
memo[0] = 1;
9+
10+
for (int i = 1; i <= n; i++)
11+
{
12+
for (int j = min(i,r); j > 0; j--)
13+
{
14+
memo[j] = (memo[j] + memo[j-1]) % p ;
15+
}
16+
}
17+
return memo[r];
18+
}
19+
20+
ll C(ll n, ll r, ll p) // p is small prime
21+
{
22+
if (r==0)
23+
{
24+
return 1;
25+
}
26+
if (r>n) //degenerate case
27+
{
28+
return 0;
29+
}
30+
31+
int nd = n%p;
32+
int rd = r%p;
33+
34+
return ( C(n/p, r/p, p)*dp(nd, rd, p) )%p;
35+
36+
}
37+
38+
]]></content>
39+
<!-- Optional: Set a tabTrigger to define how to trigger the snippet -->
40+
<tabTrigger>binomial-small-mod</tabTrigger>
41+
<!-- Optional: Set a scope to limit where the snippet will trigger -->
42+
<!-- <scope>source.python</scope> -->
43+
</snippet>

mathematics/gcd.sublime-snippet

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<snippet>
2+
<content><![CDATA[
3+
ll gcd( ll a, ll b )
4+
{
5+
if(b==0)
6+
{
7+
return a;
8+
}
9+
else
10+
{
11+
return gcd( b, a%b );
12+
}
13+
}
14+
ll lcm (ll a, ll b)
15+
{
16+
return (a*b)/gcd(a,b);
17+
}
18+
]]></content>
19+
<!-- Optional: Set a tabTrigger to define how to trigger the snippet -->
20+
<tabTrigger>gcd</tabTrigger>
21+
<!-- Optional: Set a scope to limit where the snippet will trigger -->
22+
<!-- <scope>source.cpp</scope> -->
23+
</snippet>
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<snippet>
2+
<content><![CDATA[
3+
ll power(ll a, ll b) //a is base, b is exponent
4+
{
5+
if(b==0)
6+
return 1;
7+
if(b==1)
8+
return a;
9+
if(b%2 == 1)
10+
return (power(a,b-1)*a)%mod;
11+
ll q = power(a,b/2);
12+
return (q*q)%mod;
13+
}
14+
]]></content>
15+
<!-- Optional: Set a tabTrigger to define how to trigger the snippet -->
16+
<tabTrigger>power</tabTrigger>
17+
<!-- Optional: Set a scope to limit where the snippet will trigger -->
18+
<!-- <scope>source.python</scope> -->
19+
</snippet>
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
<snippet>
2+
<content><![CDATA[
3+
pair<ll,pair<ll,ll> > egcd(ll a, ll b) //solves ax + by = gcd(a,b) = g
4+
{ //returns (g,(x,y))
5+
pair<ll,pair<ll,ll> > ret;
6+
7+
if (a==0)
8+
{
9+
ret.f = b ;
10+
ret.s.f = 0 ;
11+
ret.s.s = 1 ;
12+
}
13+
else
14+
{
15+
ll g, x, y;
16+
pair<ll,pair<ll,ll> > temp = egcd( b%a, a) ;
17+
g = temp.f;
18+
x = temp.s.f;
19+
y = temp.s.s;
20+
ret.f = g;
21+
ret.s.f = y - (b/a)*x ;
22+
ret.s.s = x;
23+
}
24+
25+
return ret;
26+
}
27+
28+
ll modinv(ll den, ll m)
29+
{
30+
pair<ll,pair<ll,ll> > ans = egcd(den, m) ;
31+
if (ans.f == 1)
32+
{
33+
return (ans.s.f+m) % m ;
34+
}
35+
}
36+
37+
38+
ll moddiv(ll num, ll den, ll m) // den and m must be coprime
39+
{
40+
return (num * modinv(den,m) ) % m ;
41+
}
42+
43+
]]></content>
44+
<!-- Optional: Set a tabTrigger to define how to trigger the snippet -->
45+
<tabTrigger>moddiv</tabTrigger>
46+
<!-- Optional: Set a scope to limit where the snippet will trigger -->
47+
<!-- <scope>source.cpp</scope> -->
48+
</snippet>

0 commit comments

Comments
 (0)