Ankit_132

Split and ADD

Sep 20th, 2023
399
0
Never
1
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.18 KB | None | 0 0
  1.  
  2. #include <bits/stdc++.h>
  3.  
  4. using namespace std;
  5.  
  6. #define ll     long long
  7. #define _test   int _TEST; cin>>_TEST; while(_TEST--)
  8.  
  9. int main()
  10. {
  11.  
  12.     ll int MOD = 1e9 + 7;
  13.     ll int inv2 = 500000004;
  14.     ll int inv4 = 250000002;
  15.  
  16.     _test
  17.     {
  18.         ll int n, l, r;
  19.         cin>>n>>l>>r;
  20.  
  21.         ll int total = n%MOD;
  22.         total %= MOD;
  23.         total *= ((n+1)%MOD);
  24.         total %= MOD;
  25.         total *= inv2;
  26.         total %= MOD;
  27.  
  28.         ll int z = 0;
  29.  
  30.         function <ll int(ll int, ll int, ll int)> sum = [&](ll int x, ll int cnt, ll int tot)
  31.         {
  32.             if(x == 0)          return z;
  33.             if(x == cnt)        return tot%MOD;
  34.  
  35.             cnt /= 2;
  36.  
  37.             ll int lsum = ((tot*inv2)%MOD - ((n%MOD)*inv4)%MOD + MOD) % MOD;
  38.             ll int rsum = ((tot*inv2)%MOD + ((n%MOD)*inv4)%MOD + MOD) % MOD;
  39.  
  40.             if(x >= cnt)        return (lsum + sum(x-cnt, cnt, rsum)) % MOD;
  41.             else                return sum(x, cnt, lsum) % MOD;
  42.         };
  43.  
  44.         auto getSum = [&](ll int x)
  45.         {
  46.             return sum(x, n, total)%MOD;
  47.         };
  48.  
  49.         cout<<(getSum(r) - getSum(l-1) + MOD) % MOD<<"\n";
  50.     }
  51. }
  52.  
Advertisement
Comments
Add Comment
Please, Sign In to add comment