integer(16)::mo = 10**9 + 7
integer(16)h, w, t
integer(16) gh,gw
integer(16) ans
read*,h,w,t
gh = gcd(h, t)
gw = gcd(w, t)
h =h/ gh
w =w/ gw
ans = mod((power(2_16, h) + power(2_16, w) - 1_16 + mo),mo)
ans = mod((ans + power(2_16,gcd(h, w)) - 2_16 + mo),mo) 
print"(i0)",power(ans, gh * gw)
contains
integer(16) function power(x,y)
integer(16) x,k
integer(16) y,l2
power=1
l2=y
k=x
do
  if(mod(l2,2)==1)power=mod(power*k,mo)
  k=mod(k*k,mo)
  l2=l2/2
  if(l2==0)exit
end do
end function
integer(16) recursive function gcd(a, b)result(res)
  integer(16), intent(in)::a, b
  res=merge(b, gcd(b, mod(a, b)),mod(a, b)==0)
end function
end 

; ModuleID = 'FIRModule'
source_filename = "FIRModule"
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-linux-gnu"

@_QQcl.e7ec3fc3d3de56b652b13a01514a7699 = linkonce constant [73 x i8] c"/home/ubuntu/Downloads/TheStack_IR/Collated/Fortran/Source_2963/source.f\00"
@_QQcl.28693029 = linkonce constant [4 x i8] c"(i0)"
@_QQEnvironmentDefaults = local_unnamed_addr constant ptr null

define void @_QQmain() local_unnamed_addr {
  %1 = alloca i128, align 8
  %2 = alloca i128, align 8
  %3 = alloca i128, align 8
  %4 = tail call ptr @_FortranAioBeginExternalListInput(i32 -1, ptr nonnull @_QQcl.e7ec3fc3d3de56b652b13a01514a7699, i32 5)
  %5 = call i1 @_FortranAioInputInteger(ptr %4, ptr nonnull %1, i32 16)
  %6 = call i1 @_FortranAioInputInteger(ptr %4, ptr nonnull %3, i32 16)
  %7 = call i1 @_FortranAioInputInteger(ptr %4, ptr nonnull %2, i32 16)
  %8 = call i32 @_FortranAioEndIoStatement(ptr %4)
  %9 = call i128 @_QFPgcd(ptr nonnull %1, ptr nonnull %2)
  %10 = call i128 @_QFPgcd(ptr nonnull %3, ptr nonnull %2)
  %11 = load i128, ptr %1, align 8, !tbaa !3
  %12 = sdiv i128 %11, %9
  store i128 %12, ptr %1, align 8, !tbaa !3
  %13 = load i128, ptr %3, align 8, !tbaa !3
  %14 = sdiv i128 %13, %10
  store i128 %14, ptr %3, align 8, !tbaa !3
  br label %15

15:                                               ; preds = %21, %0
  %.08.i = phi i128 [ 2, %0 ], [ %23, %21 ]
  %.07.i = phi i128 [ %12, %0 ], [ %24, %21 ]
  %.0.i = phi i128 [ 1, %0 ], [ %.1.i, %21 ]
  %16 = and i128 %.07.i, -170141183460469231731687303715884105727
  %17 = icmp eq i128 %16, 1
  br i1 %17, label %18, label %21

18:                                               ; preds = %15
  %19 = mul i128 %.0.i, %.08.i
  %20 = srem i128 %19, 1000000007
  br label %21

21:                                               ; preds = %18, %15
  %.1.i = phi i128 [ %20, %18 ], [ %.0.i, %15 ]
  %22 = mul nuw nsw i128 %.08.i, %.08.i
  %23 = urem i128 %22, 1000000007
  %24 = sdiv i128 %.07.i, 2
  %.07.off.i = add i128 %.07.i, 1
  %25 = icmp ult i128 %.07.off.i, 3
  br i1 %25, label %_QFPpower.exit, label %15

_QFPpower.exit:                                   ; preds = %21, %31
  %.08.i4 = phi i128 [ %33, %31 ], [ 2, %21 ]
  %.07.i5 = phi i128 [ %34, %31 ], [ %14, %21 ]
  %.0.i6 = phi i128 [ %.1.i7, %31 ], [ 1, %21 ]
  %26 = and i128 %.07.i5, -170141183460469231731687303715884105727
  %27 = icmp eq i128 %26, 1
  br i1 %27, label %28, label %31

28:                                               ; preds = %_QFPpower.exit
  %29 = mul i128 %.0.i6, %.08.i4
  %30 = srem i128 %29, 1000000007
  br label %31

31:                                               ; preds = %28, %_QFPpower.exit
  %.1.i7 = phi i128 [ %30, %28 ], [ %.0.i6, %_QFPpower.exit ]
  %32 = mul nuw nsw i128 %.08.i4, %.08.i4
  %33 = urem i128 %32, 1000000007
  %34 = sdiv i128 %.07.i5, 2
  %.07.off.i8 = add i128 %.07.i5, 1
  %35 = icmp ult i128 %.07.off.i8, 3
  br i1 %35, label %_QFPpower.exit9, label %_QFPpower.exit

_QFPpower.exit9:                                  ; preds = %31
  %36 = add i128 %.1.i, 1000000006
  %37 = add i128 %36, %.1.i7
  %38 = call i128 @_QFPgcd(ptr nonnull %1, ptr nonnull %3)
  br label %39

39:                                               ; preds = %45, %_QFPpower.exit9
  %.08.i10 = phi i128 [ 2, %_QFPpower.exit9 ], [ %47, %45 ]
  %.07.i11 = phi i128 [ %38, %_QFPpower.exit9 ], [ %48, %45 ]
  %.0.i12 = phi i128 [ 1, %_QFPpower.exit9 ], [ %.1.i13, %45 ]
  %40 = and i128 %.07.i11, -170141183460469231731687303715884105727
  %41 = icmp eq i128 %40, 1
  br i1 %41, label %42, label %45

42:                                               ; preds = %39
  %43 = mul i128 %.0.i12, %.08.i10
  %44 = srem i128 %43, 1000000007
  br label %45

45:                                               ; preds = %42, %39
  %.1.i13 = phi i128 [ %44, %42 ], [ %.0.i12, %39 ]
  %46 = mul nuw nsw i128 %.08.i10, %.08.i10
  %47 = urem i128 %46, 1000000007
  %48 = sdiv i128 %.07.i11, 2
  %.07.off.i14 = add i128 %.07.i11, 1
  %49 = icmp ult i128 %.07.off.i14, 3
  br i1 %49, label %_QFPpower.exit15, label %39

_QFPpower.exit15:                                 ; preds = %45
  %50 = srem i128 %37, 1000000007
  %51 = add nsw i128 %50, 1000000005
  %52 = add i128 %51, %.1.i13
  %53 = call ptr @_FortranAioBeginExternalFormattedOutput(ptr nonnull @_QQcl.28693029, i64 4, ptr null, i32 -1, ptr nonnull @_QQcl.e7ec3fc3d3de56b652b13a01514a7699, i32 12)
  %54 = mul i128 %10, %9
  br label %55

55:                                               ; preds = %61, %_QFPpower.exit15
  %.08.i16.in = phi i128 [ %52, %_QFPpower.exit15 ], [ %62, %61 ]
  %.07.i17 = phi i128 [ %54, %_QFPpower.exit15 ], [ %63, %61 ]
  %.0.i18 = phi i128 [ 1, %_QFPpower.exit15 ], [ %.1.i19, %61 ]
  %.08.i16 = srem i128 %.08.i16.in, 1000000007
  %56 = and i128 %.07.i17, -170141183460469231731687303715884105727
  %57 = icmp eq i128 %56, 1
  br i1 %57, label %58, label %61

58:                                               ; preds = %55
  %59 = mul i128 %.0.i18, %.08.i16
  %60 = srem i128 %59, 1000000007
  br label %61

61:                                               ; preds = %58, %55
  %.1.i19 = phi i128 [ %60, %58 ], [ %.0.i18, %55 ]
  %62 = mul nsw i128 %.08.i16, %.08.i16
  %63 = sdiv i128 %.07.i17, 2
  %.07.off.i20 = add i128 %.07.i17, 1
  %64 = icmp ult i128 %.07.off.i20, 3
  br i1 %64, label %_QFPpower.exit21, label %55

_QFPpower.exit21:                                 ; preds = %61
  %65 = call i1 @_FortranAioOutputInteger128(ptr %53, i128 %.1.i19)
  %66 = call i32 @_FortranAioEndIoStatement(ptr %53)
  ret void
}

; Function Attrs: nofree norecurse nosync nounwind memory(argmem: read)
define i128 @_QFPpower(ptr nocapture readonly %0, ptr nocapture readonly %1) local_unnamed_addr #0 {
  %3 = load i128, ptr %1, align 8, !tbaa !3
  %4 = load i128, ptr %0, align 8, !tbaa !3
  br label %5

5:                                                ; preds = %11, %2
  %.08 = phi i128 [ %4, %2 ], [ %13, %11 ]
  %.07 = phi i128 [ %3, %2 ], [ %14, %11 ]
  %.0 = phi i128 [ 1, %2 ], [ %.1, %11 ]
  %6 = and i128 %.07, -170141183460469231731687303715884105727
  %7 = icmp eq i128 %6, 1
  br i1 %7, label %8, label %11

8:                                                ; preds = %5
  %9 = mul i128 %.0, %.08
  %10 = srem i128 %9, 1000000007
  br label %11

11:                                               ; preds = %8, %5
  %.1 = phi i128 [ %10, %8 ], [ %.0, %5 ]
  %12 = mul i128 %.08, %.08
  %13 = srem i128 %12, 1000000007
  %14 = sdiv i128 %.07, 2
  %.07.off = add i128 %.07, 1
  %15 = icmp ult i128 %.07.off, 3
  br i1 %15, label %16, label %5

16:                                               ; preds = %11
  ret i128 %.1
}

; Function Attrs: nofree nosync nounwind memory(argmem: read)
define i128 @_QFPgcd(ptr nocapture readonly %0, ptr nocapture readonly %1) local_unnamed_addr #1 {
  %3 = alloca i128, align 8
  %4 = load i128, ptr %1, align 8, !tbaa !3
  %5 = load i128, ptr %0, align 8, !tbaa !3
  %6 = srem i128 %5, %4
  store i128 %6, ptr %3, align 8, !tbaa !3
  %7 = call i128 @_QFPgcd(ptr nonnull %1, ptr nonnull %3)
  %8 = icmp eq i128 %6, 0
  %9 = select i1 %8, i128 %4, i128 %7
  ret i128 %9
}

declare ptr @_FortranAioBeginExternalListInput(i32, ptr, i32) local_unnamed_addr

declare i1 @_FortranAioInputInteger(ptr, ptr, i32) local_unnamed_addr

declare i32 @_FortranAioEndIoStatement(ptr) local_unnamed_addr

declare ptr @_FortranAioBeginExternalFormattedOutput(ptr, i64, ptr, i32, ptr, i32) local_unnamed_addr

declare i1 @_FortranAioOutputInteger128(ptr, i128) local_unnamed_addr

attributes #0 = { nofree norecurse nosync nounwind memory(argmem: read) }
attributes #1 = { nofree nosync nounwind memory(argmem: read) }

!llvm.module.flags = !{!0, !1, !2}

!0 = !{i32 2, !"Debug Info Version", i32 3}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{!4, !4, i64 0}
!4 = !{!"any data access", !5, i64 0}
!5 = !{!"any access", !6, i64 0}
!6 = !{!"Flang Type TBAA Root"}
