Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define PI 3.14159265358979323846
- #define EPS 1e-6
- #define INF 1000000000
- #define _ ios_base::sync_with_stdio(0), cin.tie(0), cin.tie(0), cout.tie(0), cout.precision(15);
- #define FOR(i, a, b) for(int i=int(a); i<int(b); i++)
- #define RFOR(i, a, b) for(int i=int(a)-1; i>=int(b); i--)
- #define FORC(cont, it) for(typeof((cont).begin()) it = (cont).begin(); it != (cont).end(); it++)
- #define RFORC(cont, it) for(typeof((cont).rbegin()) it = (cont).rbegin(); it != (cont).rend(); it++)
- #define pb push_back
- using namespace std;
- typedef long long ll;
- typedef pair<int, int> ii;
- typedef vector<int> vi;
- typedef vector<ii> vii;
- #define MAXN 10
- #define MOD 1000000007LL
- ll mulmod(ll a, ll b, ll c) { // returns (a * b) % c, and minimize overflow
- ll x = 0, y = a % c;
- while (b) {
- if (b & 1) x = (x + y) % c;
- y = (y << 1) % c;
- b >>= 1;
- }
- return x % c;
- }
- ll fastPow(ll x, ll n, ll c) { // returns (a ** b) % c, and minimize overflow
- ll ret = 1;
- while (n) {
- if (n & 1) ret = mulmod(ret, x, c);
- x = mulmod(x, x, c);
- n >>= 1;
- }
- return ret;
- }
- ll sumatoria(ll n) {
- if (n & 1) {
- return ((n + 1) / 2 * n);
- }
- return ((n / 2) * (n + 1));
- }
- ll modInverse(ll a, ll p) {
- return fastPow(a, p - 2, p);
- }
- int main() { _
- ll N, K;
- while (cin >> N >> K) {
- if (N == 0) {
- cout << 0 << endl;
- continue;
- }
- ll cant = fastPow(2, K, MOD);
- ll ini = mulmod(cant, N, MOD);
- ll invMod = modInverse(cant, MOD);
- // cout << invMod << endl;
- ll ans = 0LL;
- if (ini < cant) {
- ans = sumatoria(ini) % MOD;
- cant = (cant - ini) % MOD;
- ini = MOD;
- }
- ans += (sumatoria(ini) - sumatoria(ini - cant)) % MOD;
- ans = (ans + MOD) % MOD;
- // cout << ans << " " << ini << " " << cant << " " << invMod << endl;
- cout << (((ans * 2LL) % MOD) * invMod) % MOD << endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement