Advertisement
CarlosGoogles

C

Jun 18th, 2018
348
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.01 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. #define PI 3.14159265358979323846
  4. #define EPS 1e-6
  5. #define INF 1000000000
  6.  
  7. #define _ ios_base::sync_with_stdio(0), cin.tie(0), cin.tie(0), cout.tie(0), cout.precision(15);
  8. #define FOR(i, a, b) for(int i=int(a); i<int(b); i++)
  9. #define RFOR(i, a, b) for(int i=int(a)-1; i>=int(b); i--)
  10. #define FORC(cont, it) for(typeof((cont).begin()) it = (cont).begin(); it != (cont).end(); it++)
  11. #define RFORC(cont, it) for(typeof((cont).rbegin()) it = (cont).rbegin(); it != (cont).rend(); it++)
  12. #define pb push_back
  13.  
  14. using namespace std;
  15.  
  16. typedef long long ll;
  17. typedef pair<int, int> ii;
  18. typedef vector<int> vi;
  19. typedef vector<ii> vii;
  20.  
  21. #define MAXN 10
  22. #define MOD 1000000007LL
  23.  
  24. ll mulmod(ll a, ll b, ll c) { // returns (a * b) % c, and minimize overflow
  25.     ll x = 0, y = a % c;
  26.     while (b) {
  27.         if (b & 1) x = (x + y) % c;
  28.         y = (y << 1) % c;
  29.         b >>= 1;
  30.     }
  31.     return x % c;
  32. }
  33.  
  34. ll fastPow(ll x, ll n, ll c) { // returns (a ** b) % c, and minimize overflow
  35.     ll ret = 1;
  36.     while (n) {
  37.         if (n & 1) ret = mulmod(ret, x, c);
  38.         x = mulmod(x, x, c);
  39.         n >>= 1;
  40.     }
  41.     return ret;
  42. }
  43.  
  44. ll sumatoria(ll n) {
  45.     if (n & 1) {
  46.         return ((n + 1) / 2 * n);
  47.     }
  48.     return ((n / 2) * (n + 1));
  49. }
  50.  
  51. ll modInverse(ll a, ll p) {
  52.     return fastPow(a, p - 2, p);
  53. }
  54.  
  55. int main() { _
  56.     ll N, K;
  57.  
  58.     while (cin >> N >> K) {
  59.         if (N == 0) {
  60.             cout << 0 << endl;
  61.             continue;
  62.         }
  63.         ll cant = fastPow(2, K, MOD);
  64.         ll ini = mulmod(cant, N, MOD);
  65.         ll invMod = modInverse(cant, MOD);
  66.         // cout << invMod << endl;
  67.  
  68.         ll ans = 0LL;
  69.         if (ini < cant) {
  70.             ans = sumatoria(ini) % MOD;
  71.  
  72.             cant = (cant - ini) % MOD;
  73.             ini = MOD;
  74.         }
  75.  
  76.         ans += (sumatoria(ini) - sumatoria(ini - cant)) % MOD;
  77.         ans = (ans + MOD) % MOD;
  78.         // cout << ans << " " << ini << " " << cant << " " << invMod << endl;
  79.  
  80.         cout << (((ans * 2LL) % MOD) * invMod) % MOD << endl;
  81.     }
  82.  
  83.     return 0;
  84. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement