Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- #define ll long long
- #define MOD 1000000007
- ll bigmod(ll base, ll pw, ll mod)
- {
- if(pw==0) return 1%mod;
- ll x=bigmod(base,pw/2,mod); //dividing the job into two parts(2^5=2^2&2^2)
- x=(x*x)%mod; //combining the divided parts
- if(pw%2!=0) x=(x*base)%mod; // if(powe if odd left part is being multiplied)
- return x;
- }
- ll mFact[11111111];
- void modFact(ll modval)
- {
- mFact[0]=1;
- for(int i=1;i<=10000000;i++){
- mFact[i]=(((mFact[i-1]%modval)*(i%modval))%modval);
- }
- }
- ll invmod(ll y, ll x, ll modval)
- {
- ll down=bigmod(x,modval-2,modval);
- return ((y%modval)*(down%modval))%modval;
- }
- ll nCr(ll n, ll r, ll modval)
- {
- // cout<<n<<" "<<mFact[n]<<endl;
- // cout<<r<<" "<<mFact[r]<<endl;
- // cout<<n-r<<" "<<mFact[n-r]<<endl;
- ll rv=((mFact[n]%modval)*((bigmod(mFact[r],modval-2,modval))%modval)*((bigmod(mFact[n-r],modval-2,modval)%modval)))%modval;
- return rv;
- }
- ll nCr2(ll n, ll r, ll modval)
- {
- ll rv=1;
- ll x=r, y=n-r;
- ll total=1;
- if(x<y) swap(x,y);
- for(ll i=n;i>x;i--){
- total=((total%modval)*(i%modval))%modval;
- }
- return invmod(total,y,modval);
- }
- int main()
- {
- //in1();
- //out1();
- clock_t tStart = clock();
- modFact(MOD);
- cout<<nCr(10,3,MOD)<<endl;
- cout<<nCr2(10,3,MOD)<<endl;
- printf("\n>>Runtime: %.10fs\n", (double) (clock() - tStart) / CLOCKS_PER_SEC);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement