Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- #define int long long
- using namespace std;
- const int MN = 2e5 + 5;
- int f[MN];
- int invf[MN];
- const int MOD = 1e9 + 7;
- int Binexpitr(int a,int b){
- int ans = 1;
- while(b){
- if(b&1){
- ans = (ans* 1ll *a)%MOD;
- }
- a = (a* 1ll *a)%MOD;
- b >>= 1;
- }
- return ans;
- }
- int ncr(int n, int k){
- if(n<k){
- return 0;
- }
- int ans = f[n];
- ans *= invf[k];
- ans %= MOD;
- ans *= invf[n-k];
- ans %= MOD;
- ans += MOD;
- ans %= MOD;
- return ans;
- }
- signed main(){
- f[0] = 1;
- for(int i=1;i<MN;i++){
- f[i] = (f[i-1]*i)%MOD;
- }
- invf[MN - 1] = Binexpitr(f[MN-1],MOD-2);
- for(int i = MN-2;i>=0;i--){
- invf[i] = (invf[i+1]*(i+1))%MOD;
- }
- int n,k;
- cin>>n>>k;
- map<int,int> m;
- map<int,int> m2;
- for(int i=0;i<n;i++){
- int x,y;
- cin>>x>>y;
- m[x]++;
- m2[y]++;
- }
- vector<pair<int,int>> v;
- for(auto it : m){
- v.push_back({it.first,-1*it.second});
- }
- for(auto it : m2){
- v.push_back({it.first,it.second});
- }
- sort(v.begin(),v.end());
- int k1 = -1*v[0].second;
- int ans = 0;
- for(int i=1;i<v.size();i++){
- int di = v[i].first - v[i-1].first;
- if(v[i-1].second > 0){
- di--;
- }
- if(v[i].second > 0){
- di++;
- }
- if(n-k1 < k){
- ans += (di)*((ncr(n,k)));
- }
- else{
- ans += (di)*((ncr(n,k)) - ncr(n-k1,k));
- }
- ans %= MOD;
- ans += MOD;
- ans %= MOD;
- k1 += -1*(v[i].second);
- }
- cout<<ans<<'\n';
- }
Advertisement