source_code: import java.io.BufferedReader;
  import java.io.IOException;
  import java.io.InputStream;
  import java.io.InputStreamReader;
  import java.util.StringTokenizer;
  import java.io.PrintWriter;
  public class C992 
  {
      static class Scanner
      {
          BufferedReader br;
          StringTokenizer tk=new StringTokenizer("");
          public Scanner(InputStream is) 
          {
              br=new BufferedReader(new InputStreamReader(is));
          }
          public int nextInt() throws IOException
          {
              if(tk.hasMoreTokens())
                  return Integer.parseInt(tk.nextToken());
              tk=new StringTokenizer(br.readLine());
              return nextInt();
          }
          public long nextLong() throws IOException
          {
              if(tk.hasMoreTokens())
                  return Long.parseLong(tk.nextToken());
              tk=new StringTokenizer(br.readLine());
              return nextLong();
          }
          public String next() throws IOException
          {
              if(tk.hasMoreTokens())
                  return (tk.nextToken());
              tk=new StringTokenizer(br.readLine());
              return next();
          }
          public String nextLine() throws IOException
          {
              tk=new StringTokenizer("");
              return br.readLine();
          }
          public double nextDouble() throws IOException
          {
              if(tk.hasMoreTokens())
                  return Double.parseDouble(tk.nextToken());
              tk=new StringTokenizer(br.readLine());
              return nextDouble();
          }
          public char nextChar() throws IOException
          {
              if(tk.hasMoreTokens())
                  return (tk.nextToken().charAt(0));
              tk=new StringTokenizer(br.readLine());
              return nextChar();
          }
          public int[] nextIntArray(int n) throws IOException
          {
              int a[]=new int[n];
              for(int i=0;i<n;i++)
                  a[i]=nextInt();
              return a;
          }
          public long[] nextLongArray(int n) throws IOException
          {
              long a[]=new long[n];
              for(int i=0;i<n;i++)
                  a[i]=nextLong();
              return a;
          }
          public int[] nextIntArrayOneBased(int n) throws IOException
          {
              int a[]=new int[n+1];
              for(int i=1;i<=n;i++)
                  a[i]=nextInt();
              return a;
          }
          public long[] nextLongArrayOneBased(int n) throws IOException
          {
              long a[]=new long[n+1];
              for(int i=1;i<=n;i++)
                  a[i]=nextLong();
              return a;
          }
      
      
      }
      static long mod=1000000007;
      static long mod_exp(long base,long exp)
      {
          long ans=1;
          base%=mod;
          while(exp>0)
          {
              if(exp%2==1)
              {
                  ans*=base;
                  ans%=mod;
              }
              exp/=2;
              base*=base;
              base%=mod;
          }
          return ans;
      }
      public static void main(String args[]) throws IOException
      {
          Scanner in=new Scanner(System.in);
          PrintWriter out=new PrintWriter(System.out);
          long x=in.nextLong();
          long k=in.nextLong();
          
          long ans=mod_exp(2,k+1);
          ans*=(x%mod);
          ans%=mod;
          ans-=mod_exp(2,k);
          ans%=mod;
          ans++;
          ans%=mod;
          if(ans<0)
              ans+=mod;
          if(x==0)
              ans=0;
          out.println(ans);
          out.close();
      }
  
  }
  