mirror of
https://github.com/Hizenberg469/Algorithms-snippets.git
synced 2026-04-19 22:52:23 +03:00
Binomial Coefficient
This commit is contained in:
41
Number Theory/Dp_nCr.cpp
Normal file
41
Number Theory/Dp_nCr.cpp
Normal file
@@ -0,0 +1,41 @@
|
||||
#include <bits/stdc++.h>
|
||||
|
||||
using namespace std;
|
||||
|
||||
vector<vector<int>> nCr;
|
||||
void binomialCoefficient(int n,int k){
|
||||
|
||||
nCr.resize(n+1,vector<int>(k+1,0));
|
||||
|
||||
nCr[1][0] = nCr[1][1] = 1;
|
||||
|
||||
for(int i = 2 ; i <= n ; i++ ){
|
||||
for(int j = 0 ; j <= min(i,k) ; j++ ){
|
||||
|
||||
if( j == 0 ){
|
||||
nCr[i][j] = 1;
|
||||
continue;
|
||||
}
|
||||
|
||||
if( j == 1 || j == 0 ){
|
||||
nCr[i][j] = i;
|
||||
continue;
|
||||
}
|
||||
|
||||
nCr[i][j] = nCr[i-1][j]+nCr[i-1][j-1];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int main(int argc,char* argv[]){
|
||||
|
||||
binomialCoefficient(5,5);
|
||||
|
||||
for(int i = 0 ; i <= 5 ; i++ ){
|
||||
for(int j = 0 ; j <= 5 ; j++ ){
|
||||
cout << nCr[i][j] << " ";
|
||||
}
|
||||
cout << endl;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -1,19 +1,19 @@
|
||||
#include <bits/stdc++.h>
|
||||
|
||||
using namespace std;
|
||||
|
||||
int binary_multiplication(int a , int b,int M=(int)1e9+7){
|
||||
int res = 0;
|
||||
while( b ){
|
||||
if( b&1 ) res += a , res %= M;
|
||||
a = 2 * a ; a %= M:
|
||||
b >>= 1;
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
int main(){
|
||||
|
||||
return 0;
|
||||
}
|
||||
#include <bits/stdc++.h>
|
||||
|
||||
using namespace std;
|
||||
|
||||
int binary_multiplication(int a , int b,int M=(int)1e9+7){
|
||||
int res = 0;
|
||||
while( b ){
|
||||
if( b&1 ) res += a , res %= M;
|
||||
a = 2 * a ; a %= M:
|
||||
b >>= 1;
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
int main(){
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1,92 +1,92 @@
|
||||
#include <bits/stdc++.h>
|
||||
#define ll long long int
|
||||
|
||||
using namespace std;
|
||||
|
||||
const int M = (int)1e9+7;
|
||||
struct Mat{
|
||||
ll m[2][2];
|
||||
|
||||
Mat(){
|
||||
memset(m,0,sizeof(m));
|
||||
}
|
||||
|
||||
void identity(){
|
||||
for(int idx = 0 ; idx < 2 ; idx++ ){
|
||||
m[idx][idx] = 1;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
Mat operator* (Mat m1,Mat m2){
|
||||
Mat res;
|
||||
|
||||
for(int i = 0 ; i < 2 ; i++ ){
|
||||
for(int j = 0 ; j < 2 ; j++ ){
|
||||
for(int k = 0 ; k < 2 ; k++ ){
|
||||
res.m[i][j] += m1.m[i][k]*m2.m[k][j];
|
||||
res.m[i][j] %= M;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
Mat power(Mat X,ll n){
|
||||
Mat res;
|
||||
res.identity();
|
||||
|
||||
ll b = n;
|
||||
while(b){
|
||||
if( b&1 ) res = res*X;
|
||||
X = X*X;
|
||||
b >>= 1;
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
ll fibo(ll n){
|
||||
|
||||
if( n < 2 ) return n;
|
||||
Mat res;
|
||||
|
||||
Mat X;
|
||||
X.m[0][1] = 1 , X.m[1][0] = 1 , X.m[1][1] = 1;
|
||||
|
||||
res = power(X,n);
|
||||
|
||||
ll fn[2][1];
|
||||
fn[0][0]=0,fn[1][0]=1;
|
||||
|
||||
ll fn1[2][1];
|
||||
|
||||
for(int i = 0 ; i < 2 ; i++ ){
|
||||
for(int j = 0 ; j < 1 ; j++ ){
|
||||
for(int k = 0 ; k < 2 ; k++ ){
|
||||
fn1[i][j] = res.m[i][k]*fn[k][j];
|
||||
fn1[i][j]%=M;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return fn1[0][0];
|
||||
}
|
||||
|
||||
ll modSub(ll a,ll b){
|
||||
return ((a%M)-(b%M)+M)%M;
|
||||
}
|
||||
|
||||
int main(){
|
||||
int t;
|
||||
cin>>t;
|
||||
|
||||
while(t--){
|
||||
ll n,m;
|
||||
cin>>n>>m;
|
||||
|
||||
cout << modSub(fibo(m+2),fibo(n+1)) << '\n';
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
#include <bits/stdc++.h>
|
||||
#define ll long long int
|
||||
|
||||
using namespace std;
|
||||
|
||||
const int M = (int)1e9+7;
|
||||
struct Mat{
|
||||
ll m[2][2];
|
||||
|
||||
Mat(){
|
||||
memset(m,0,sizeof(m));
|
||||
}
|
||||
|
||||
void identity(){
|
||||
for(int idx = 0 ; idx < 2 ; idx++ ){
|
||||
m[idx][idx] = 1;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
Mat operator* (Mat m1,Mat m2){
|
||||
Mat res;
|
||||
|
||||
for(int i = 0 ; i < 2 ; i++ ){
|
||||
for(int j = 0 ; j < 2 ; j++ ){
|
||||
for(int k = 0 ; k < 2 ; k++ ){
|
||||
res.m[i][j] += m1.m[i][k]*m2.m[k][j];
|
||||
res.m[i][j] %= M;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
Mat power(Mat X,ll n){
|
||||
Mat res;
|
||||
res.identity();
|
||||
|
||||
ll b = n;
|
||||
while(b){
|
||||
if( b&1 ) res = res*X;
|
||||
X = X*X;
|
||||
b >>= 1;
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
ll fibo(ll n){
|
||||
|
||||
if( n < 2 ) return n;
|
||||
Mat res;
|
||||
|
||||
Mat X;
|
||||
X.m[0][1] = 1 , X.m[1][0] = 1 , X.m[1][1] = 1;
|
||||
|
||||
res = power(X,n);
|
||||
|
||||
ll fn[2][1];
|
||||
fn[0][0]=0,fn[1][0]=1;
|
||||
|
||||
ll fn1[2][1];
|
||||
|
||||
for(int i = 0 ; i < 2 ; i++ ){
|
||||
for(int j = 0 ; j < 1 ; j++ ){
|
||||
for(int k = 0 ; k < 2 ; k++ ){
|
||||
fn1[i][j] = res.m[i][k]*fn[k][j];
|
||||
fn1[i][j]%=M;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return fn1[0][0];
|
||||
}
|
||||
|
||||
ll modSub(ll a,ll b){
|
||||
return ((a%M)-(b%M)+M)%M;
|
||||
}
|
||||
|
||||
int main(){
|
||||
int t;
|
||||
cin>>t;
|
||||
|
||||
while(t--){
|
||||
ll n,m;
|
||||
cin>>n>>m;
|
||||
|
||||
cout << modSub(fibo(m+2),fibo(n+1)) << '\n';
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
//Extended gcd -> Recursive
|
||||
|
||||
tuple<int,int,int> extended_gcd( int a, int b){
|
||||
|
||||
if( b == 0 ){
|
||||
return {1,0,a};
|
||||
}
|
||||
|
||||
int x,y,g;
|
||||
tie(x,y,g) = extended_gcd( b , a%b );
|
||||
return {y , x - (a/b)*y , g};
|
||||
//Extended gcd -> Recursive
|
||||
|
||||
tuple<int,int,int> extended_gcd( int a, int b){
|
||||
|
||||
if( b == 0 ){
|
||||
return {1,0,a};
|
||||
}
|
||||
|
||||
int x,y,g;
|
||||
tie(x,y,g) = extended_gcd( b , a%b );
|
||||
return {y , x - (a/b)*y , g};
|
||||
}
|
||||
@@ -1,9 +1,9 @@
|
||||
int invFac[MAX_N];
|
||||
void inverse_factorial(){
|
||||
|
||||
invFac[0] = invFac[1] = 1;
|
||||
|
||||
for(int i = 2 ; i <= MAX_N ; i++ ){
|
||||
invFac[i] = (inverse(i)*invFac[i-1])%M;
|
||||
}
|
||||
int invFac[MAX_N];
|
||||
void inverse_factorial(){
|
||||
|
||||
invFac[0] = invFac[1] = 1;
|
||||
|
||||
for(int i = 2 ; i <= MAX_N ; i++ ){
|
||||
invFac[i] = (inverse(i)*invFac[i-1])%M;
|
||||
}
|
||||
}
|
||||
@@ -1,24 +1,24 @@
|
||||
vector<int> invs( vi& a , int m ){
|
||||
int n = (int)a.size();
|
||||
|
||||
if( n == 0 ) return {};
|
||||
|
||||
vector<int> b(n);
|
||||
|
||||
int v = 1;
|
||||
for(int i = 0 ; i < n ; i++ ){
|
||||
b[i] = v;
|
||||
v = ((long long)v * a[i] ) % m;
|
||||
}
|
||||
|
||||
int x = power( v , m - 2 , m ) ;
|
||||
|
||||
x = (x % m + m ) % m;
|
||||
|
||||
for(int i = n - 1 ; i >= 0 ; i-- ){
|
||||
b[i] = x * b[i] %m;
|
||||
x = x * a[i] % m;
|
||||
}
|
||||
|
||||
return b;
|
||||
vector<int> invs( vi& a , int m ){
|
||||
int n = (int)a.size();
|
||||
|
||||
if( n == 0 ) return {};
|
||||
|
||||
vector<int> b(n);
|
||||
|
||||
int v = 1;
|
||||
for(int i = 0 ; i < n ; i++ ){
|
||||
b[i] = v;
|
||||
v = ((long long)v * a[i] ) % m;
|
||||
}
|
||||
|
||||
int x = power( v , m - 2 , m ) ;
|
||||
|
||||
x = (x % m + m ) % m;
|
||||
|
||||
for(int i = n - 1 ; i >= 0 ; i-- ){
|
||||
b[i] = x * b[i] %m;
|
||||
x = x * a[i] % m;
|
||||
}
|
||||
|
||||
return b;
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
template<typename T>
|
||||
T modAdd(T a,T b,T M=(T)1e9+7){
|
||||
return ((M+a%M)%M+(M+b%M)%M)%M;
|
||||
}
|
||||
template<typename T>
|
||||
T modAdd(T a,T b,T M=(T)1e9+7){
|
||||
return ((M+a%M)%M+(M+b%M)%M)%M;
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
template<typename T>
|
||||
T modMul(T a,T b,T M=(int)1e9+7){
|
||||
return ((a%M)*(b%M))%M;
|
||||
template<typename T>
|
||||
T modMul(T a,T b,T M=(int)1e9+7){
|
||||
return ((a%M)*(b%M))%M;
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
template<typename T>
|
||||
T modSub(T a,T b,T M=(T)1e9+7){
|
||||
return (M+((M+a%M)%M-(M+b%M)%M))%M;
|
||||
template<typename T>
|
||||
T modSub(T a,T b,T M=(T)1e9+7){
|
||||
return (M+((M+a%M)%M-(M+b%M)%M))%M;
|
||||
}
|
||||
@@ -1,18 +1,18 @@
|
||||
#define MAX_N 5000001
|
||||
bool is_prime[MAX_N];
|
||||
|
||||
bool is_sieve_eval = false;
|
||||
|
||||
void sieve_erathosis(){
|
||||
if( is_sieve_eval ) return;
|
||||
is_sieve_eval = true;
|
||||
memset(is_prime,0,sizeof(is_prime));
|
||||
is_prime[0] = true , is_prime[1] = true;
|
||||
for(int num = 2 ; num*num < MAX_N ; num++ ){
|
||||
if( !is_prime[num] ){
|
||||
for(int val = num*num ; val < MAX_N ; val += num ){
|
||||
is_prime[val] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
#define MAX_N 5000001
|
||||
bool is_prime[MAX_N];
|
||||
|
||||
bool is_sieve_eval = false;
|
||||
|
||||
void sieve_erathosis(){
|
||||
if( is_sieve_eval ) return;
|
||||
is_sieve_eval = true;
|
||||
memset(is_prime,0,sizeof(is_prime));
|
||||
is_prime[0] = true , is_prime[1] = true;
|
||||
for(int num = 2 ; num*num < MAX_N ; num++ ){
|
||||
if( !is_prime[num] ){
|
||||
for(int val = num*num ; val < MAX_N ; val += num ){
|
||||
is_prime[val] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,11 +1,11 @@
|
||||
int operator%(string& a , int b){
|
||||
|
||||
int sz = (int)a.size();
|
||||
int val = 0;
|
||||
for(int idx = 0 ; idx < sz ; idx++ ){
|
||||
val = 10*val + (a[idx]-'0');
|
||||
val %= b;
|
||||
}
|
||||
|
||||
return val;
|
||||
int operator%(string& a , int b){
|
||||
|
||||
int sz = (int)a.size();
|
||||
int val = 0;
|
||||
for(int idx = 0 ; idx < sz ; idx++ ){
|
||||
val = 10*val + (a[idx]-'0');
|
||||
val %= b;
|
||||
}
|
||||
|
||||
return val;
|
||||
}
|
||||
Reference in New Issue
Block a user