program number_of_digits
  implicit none
  integer(8), parameter :: md = 1000000007_8, u = 100000000_8
  integer(8) :: s, ans = 0_8, tmp = 1_8, i, k
  integer(8) :: l = 1_8, r = 1_8, dl = 1_8, dr = 1_8, nxtl = 10_8, nxtr = 10_8
  read(*,*) s
  do while (l < u)
    do while (tmp < s)
      r = r+1_8
      if (r == nxtr) then
        dr = dr+1_8
        nxtr = nxtr*10_8
      end if
      tmp = tmp+dr
    end do
    if (tmp == s) ans = ans+1_8
    tmp = tmp-dl
    l = l+1_8
    if (l == nxtl) then
      dl = dl+1_8
      nxtl = nxtl*10_8
    end if
  end do
  do i = 1_8, s
    k = s/i
    if (k <= 8) exit
    if (mod(s,i) == 0_8) then
      ans = modulo(ans+9_8*pow(10_8,int(k-1_8))-i+1_8,md)
    else
      ans = mod(ans+1_8,md)
    end if
  end do
  write(*,'(i0)') ans
contains
  function pow(a,b) result(r)
    integer(8), intent(in) :: a
    integer, intent(in) :: b
    integer(8) :: r, p
    integer :: k
    r = 1_8
    p = a
    k = b
    do while (k > 0)
      if (btest(k,0)) r = mod(r*p,md)
      p = mod(p*p,md)
      k = rshift(k,1)
    end do
  end
end program number_of_digits
; 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"

@_QFEans = internal unnamed_addr global i64 0
@_QFEdl = internal unnamed_addr global i64 1
@_QFEdr = internal unnamed_addr global i64 1
@_QFEl = internal unnamed_addr global i64 1
@_QFEnxtl = internal unnamed_addr global i64 10
@_QFEnxtr = internal unnamed_addr global i64 10
@_QFEr = internal unnamed_addr global i64 1
@_QFEtmp = internal unnamed_addr global i64 1
@_QQcl.56c7f32c14731452b568bf3493b36720 = linkonce constant [73 x i8] c"/home/ubuntu/Downloads/TheStack_IR/Collated/Fortran/Source_6355/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 i64, align 8
  %2 = tail call ptr @_FortranAioBeginExternalListInput(i32 -1, ptr nonnull @_QQcl.56c7f32c14731452b568bf3493b36720, i32 6)
  %3 = call i1 @_FortranAioInputInteger(ptr %2, ptr nonnull %1, i32 8)
  %4 = call i32 @_FortranAioEndIoStatement(ptr %2)
  %5 = load i64, ptr %1, align 8
  %_QFEl.promoted = load i64, ptr @_QFEl, align 8, !tbaa !3
  %_QFEans.promoted35 = load i64, ptr @_QFEans, align 8, !tbaa !3
  %_QFEtmp.promoted = load i64, ptr @_QFEtmp, align 8, !tbaa !3
  %_QFEdr.promoted = load i64, ptr @_QFEdr, align 8, !tbaa !3
  %_QFEnxtr.promoted = load i64, ptr @_QFEnxtr, align 8, !tbaa !3
  %_QFEr.promoted = load i64, ptr @_QFEr, align 8, !tbaa !3
  %_QFEdl.promoted = load i64, ptr @_QFEdl, align 8
  %_QFEnxtl.promoted = load i64, ptr @_QFEnxtl, align 8
  br label %thread-pre-split

thread-pre-split:                                 ; preds = %0, %36
  %_QFEans.promoted66 = phi i64 [ %_QFEans.promoted35, %0 ], [ %_QFEans.promoted67, %36 ]
  %6 = phi i64 [ %_QFEnxtl.promoted, %0 ], [ %38, %36 ]
  %7 = phi i64 [ %_QFEdl.promoted, %0 ], [ %37, %36 ]
  %_QFEr.promoted3152 = phi i64 [ %_QFEr.promoted, %0 ], [ %_QFEr.promoted3150, %36 ]
  %_QFEnxtr.promoted2649 = phi i64 [ %_QFEnxtr.promoted, %0 ], [ %_QFEnxtr.promoted2645, %36 ]
  %_QFEdr.promoted2144 = phi i64 [ %_QFEdr.promoted, %0 ], [ %_QFEdr.promoted2140, %36 ]
  %_QFEtmp.promoted1939 = phi i64 [ %_QFEtmp.promoted, %0 ], [ %33, %36 ]
  %_QFEans.promoted38 = phi i64 [ %_QFEans.promoted35, %0 ], [ %_QFEans.promoted36, %36 ]
  %.pr34 = phi i64 [ %_QFEl.promoted, %0 ], [ %6, %36 ]
  br label %8

8:                                                ; preds = %thread-pre-split, %31
  %_QFEans.promoted = phi i64 [ %_QFEans.promoted66, %thread-pre-split ], [ %_QFEans.promoted67, %31 ]
  %_QFEr.promoted3151 = phi i64 [ %_QFEr.promoted3152, %thread-pre-split ], [ %_QFEr.promoted3150, %31 ]
  %_QFEnxtr.promoted2648 = phi i64 [ %_QFEnxtr.promoted2649, %thread-pre-split ], [ %_QFEnxtr.promoted2645, %31 ]
  %_QFEdr.promoted2143 = phi i64 [ %_QFEdr.promoted2144, %thread-pre-split ], [ %_QFEdr.promoted2140, %31 ]
  %_QFEans.promoted37 = phi i64 [ %_QFEans.promoted38, %thread-pre-split ], [ %_QFEans.promoted36, %31 ]
  %.lcssa1733 = phi i64 [ %_QFEr.promoted3152, %thread-pre-split ], [ %.lcssa1732, %31 ]
  %_QFEnxtr.promoted30 = phi i64 [ %_QFEnxtr.promoted2649, %thread-pre-split ], [ %_QFEnxtr.promoted27, %31 ]
  %_QFEdr.promoted25 = phi i64 [ %_QFEdr.promoted2144, %thread-pre-split ], [ %_QFEdr.promoted22, %31 ]
  %.lcssa1820 = phi i64 [ %_QFEtmp.promoted1939, %thread-pre-split ], [ %33, %31 ]
  %9 = phi i64 [ %_QFEans.promoted38, %thread-pre-split ], [ %32, %31 ]
  %10 = phi i64 [ %.pr34, %thread-pre-split ], [ %34, %31 ]
  %11 = icmp slt i64 %10, 100000000
  br i1 %11, label %.preheader, label %39

.preheader:                                       ; preds = %8
  %12 = icmp slt i64 %.lcssa1820, %5
  br i1 %12, label %.lr.ph, label %27

.lr.ph:                                           ; preds = %.preheader, %22
  %_QFEnxtr.promoted2647 = phi i64 [ %_QFEnxtr.promoted2646, %22 ], [ %_QFEnxtr.promoted2648, %.preheader ]
  %_QFEdr.promoted2142 = phi i64 [ %_QFEdr.promoted2141, %22 ], [ %_QFEdr.promoted2143, %.preheader ]
  %_QFEnxtr.promoted29 = phi i64 [ %_QFEnxtr.promoted28, %22 ], [ %_QFEnxtr.promoted30, %.preheader ]
  %_QFEdr.promoted24 = phi i64 [ %_QFEdr.promoted23, %22 ], [ %_QFEdr.promoted25, %.preheader ]
  %13 = phi i64 [ %25, %22 ], [ %.lcssa1820, %.preheader ]
  %14 = phi i64 [ %17, %22 ], [ %.lcssa1733, %.preheader ]
  %15 = phi i64 [ %24, %22 ], [ %_QFEnxtr.promoted30, %.preheader ]
  %16 = phi i64 [ %23, %22 ], [ %_QFEdr.promoted25, %.preheader ]
  %17 = add i64 %14, 1
  %18 = icmp eq i64 %17, %15
  br i1 %18, label %19, label %22

19:                                               ; preds = %.lr.ph
  %20 = add i64 %16, 1
  store i64 %20, ptr @_QFEdr, align 8, !tbaa !3
  %21 = mul i64 %15, 10
  store i64 %21, ptr @_QFEnxtr, align 8, !tbaa !3
  br label %22

22:                                               ; preds = %19, %.lr.ph
  %_QFEnxtr.promoted2646 = phi i64 [ %21, %19 ], [ %_QFEnxtr.promoted2647, %.lr.ph ]
  %_QFEdr.promoted2141 = phi i64 [ %20, %19 ], [ %_QFEdr.promoted2142, %.lr.ph ]
  %_QFEnxtr.promoted28 = phi i64 [ %21, %19 ], [ %_QFEnxtr.promoted29, %.lr.ph ]
  %_QFEdr.promoted23 = phi i64 [ %20, %19 ], [ %_QFEdr.promoted24, %.lr.ph ]
  %23 = phi i64 [ %20, %19 ], [ %16, %.lr.ph ]
  %24 = phi i64 [ %21, %19 ], [ %15, %.lr.ph ]
  %25 = add i64 %23, %13
  %26 = icmp slt i64 %25, %5
  br i1 %26, label %.lr.ph, label %._crit_edge

._crit_edge:                                      ; preds = %22
  store i64 %17, ptr @_QFEr, align 8, !tbaa !3
  br label %27

27:                                               ; preds = %._crit_edge, %.preheader
  %_QFEr.promoted3150 = phi i64 [ %17, %._crit_edge ], [ %_QFEr.promoted3151, %.preheader ]
  %_QFEnxtr.promoted2645 = phi i64 [ %_QFEnxtr.promoted2646, %._crit_edge ], [ %_QFEnxtr.promoted2648, %.preheader ]
  %_QFEdr.promoted2140 = phi i64 [ %_QFEdr.promoted2141, %._crit_edge ], [ %_QFEdr.promoted2143, %.preheader ]
  %.lcssa1732 = phi i64 [ %17, %._crit_edge ], [ %.lcssa1733, %.preheader ]
  %_QFEnxtr.promoted27 = phi i64 [ %_QFEnxtr.promoted28, %._crit_edge ], [ %_QFEnxtr.promoted30, %.preheader ]
  %_QFEdr.promoted22 = phi i64 [ %_QFEdr.promoted23, %._crit_edge ], [ %_QFEdr.promoted25, %.preheader ]
  %.lcssa13 = phi i64 [ %25, %._crit_edge ], [ %.lcssa1820, %.preheader ]
  %28 = icmp eq i64 %.lcssa13, %5
  br i1 %28, label %29, label %31

29:                                               ; preds = %27
  %30 = add i64 %9, 1
  store i64 %30, ptr @_QFEans, align 8, !tbaa !3
  br label %31

31:                                               ; preds = %29, %27
  %_QFEans.promoted67 = phi i64 [ %30, %29 ], [ %_QFEans.promoted, %27 ]
  %_QFEans.promoted36 = phi i64 [ %30, %29 ], [ %_QFEans.promoted37, %27 ]
  %32 = phi i64 [ %30, %29 ], [ %9, %27 ]
  %33 = sub i64 %.lcssa13, %7
  store i64 %33, ptr @_QFEtmp, align 8, !tbaa !3
  %34 = add i64 %10, 1
  store i64 %34, ptr @_QFEl, align 8, !tbaa !3
  %35 = icmp eq i64 %34, %6
  br i1 %35, label %36, label %8

36:                                               ; preds = %31
  %37 = add i64 %7, 1
  store i64 %37, ptr @_QFEdl, align 8, !tbaa !3
  %38 = mul i64 %6, 10
  store i64 %38, ptr @_QFEnxtl, align 8, !tbaa !3
  br label %thread-pre-split

39:                                               ; preds = %8
  %40 = icmp sgt i64 %5, 0
  br i1 %40, label %.lr.ph59, label %._crit_edge60

.lr.ph59:                                         ; preds = %39, %71
  %.0856 = phi i64 [ %72, %71 ], [ 1, %39 ]
  %storemerge5455 = phi i64 [ %storemerge, %71 ], [ %_QFEans.promoted, %39 ]
  %41 = sdiv i64 %5, %.0856
  %42 = srem i64 %5, %.0856
  %43 = icmp slt i64 %41, 9
  br i1 %43, label %._crit_edge60, label %44

44:                                               ; preds = %.lr.ph59
  %45 = icmp eq i64 %42, 0
  br i1 %45, label %46, label %68

46:                                               ; preds = %44
  %47 = trunc i64 %41 to i32
  %48 = add i32 %47, -1
  %49 = icmp sgt i32 %48, 0
  br i1 %49, label %.lr.ph.i, label %_QFPpow.exit

.lr.ph.i:                                         ; preds = %46, %54
  %.011.i = phi i64 [ %.1.i, %54 ], [ 1, %46 ]
  %.0710.i = phi i64 [ %56, %54 ], [ 10, %46 ]
  %.089.i = phi i32 [ %57, %54 ], [ %48, %46 ]
  %50 = and i32 %.089.i, 1
  %.not.i = icmp eq i32 %50, 0
  br i1 %.not.i, label %54, label %51

51:                                               ; preds = %.lr.ph.i
  %52 = mul i64 %.0710.i, %.011.i
  %53 = srem i64 %52, 1000000007
  br label %54

54:                                               ; preds = %51, %.lr.ph.i
  %.1.i = phi i64 [ %53, %51 ], [ %.011.i, %.lr.ph.i ]
  %55 = mul nuw nsw i64 %.0710.i, %.0710.i
  %56 = urem i64 %55, 1000000007
  %57 = lshr i32 %.089.i, 1
  %.not12.i = icmp ult i32 %.089.i, 2
  br i1 %.not12.i, label %_QFPpow.exit, label %.lr.ph.i

_QFPpow.exit:                                     ; preds = %54, %46
  %.0.lcssa.i = phi i64 [ 1, %46 ], [ %.1.i, %54 ]
  %58 = mul i64 %.0.lcssa.i, 9
  %59 = sub i64 1, %.0856
  %60 = add i64 %59, %storemerge5455
  %61 = add i64 %60, %58
  %62 = srem i64 %61, 1000000007
  %63 = icmp slt i64 %61, 0
  %64 = icmp ne i64 %62, 0
  %65 = and i1 %63, %64
  %66 = add nsw i64 %62, 1000000007
  %67 = select i1 %65, i64 %66, i64 %62
  br label %71

68:                                               ; preds = %44
  %69 = add i64 %storemerge5455, 1
  %70 = srem i64 %69, 1000000007
  br label %71

71:                                               ; preds = %_QFPpow.exit, %68
  %storemerge = phi i64 [ %70, %68 ], [ %67, %_QFPpow.exit ]
  store i64 %storemerge, ptr @_QFEans, align 8, !tbaa !3
  %72 = add nuw i64 %.0856, 1
  %exitcond.not = icmp eq i64 %.0856, %5
  br i1 %exitcond.not, label %._crit_edge60, label %.lr.ph59

._crit_edge60:                                    ; preds = %71, %.lr.ph59, %39
  %73 = call ptr @_FortranAioBeginExternalFormattedOutput(ptr nonnull @_QQcl.28693029, i64 4, ptr null, i32 -1, ptr nonnull @_QQcl.56c7f32c14731452b568bf3493b36720, i32 33)
  %74 = load i64, ptr @_QFEans, align 8, !tbaa !3
  %75 = call i1 @_FortranAioOutputInteger64(ptr %73, i64 %74)
  %76 = call i32 @_FortranAioEndIoStatement(ptr %73)
  ret void
}

; Function Attrs: nofree norecurse nosync nounwind memory(argmem: read)
define i64 @_QFPpow(ptr nocapture readonly %0, ptr nocapture readonly %1) local_unnamed_addr #0 {
  %3 = load i32, ptr %1, align 4, !tbaa !3
  %4 = icmp sgt i32 %3, 0
  br i1 %4, label %.lr.ph.preheader, label %._crit_edge

.lr.ph.preheader:                                 ; preds = %2
  %5 = load i64, ptr %0, align 8, !tbaa !3
  br label %.lr.ph

.lr.ph:                                           ; preds = %.lr.ph.preheader, %10
  %.011 = phi i64 [ %.1, %10 ], [ 1, %.lr.ph.preheader ]
  %.0710 = phi i64 [ %12, %10 ], [ %5, %.lr.ph.preheader ]
  %.089 = phi i32 [ %13, %10 ], [ %3, %.lr.ph.preheader ]
  %6 = and i32 %.089, 1
  %.not = icmp eq i32 %6, 0
  br i1 %.not, label %10, label %7

7:                                                ; preds = %.lr.ph
  %8 = mul i64 %.011, %.0710
  %9 = srem i64 %8, 1000000007
  br label %10

10:                                               ; preds = %7, %.lr.ph
  %.1 = phi i64 [ %9, %7 ], [ %.011, %.lr.ph ]
  %11 = mul i64 %.0710, %.0710
  %12 = srem i64 %11, 1000000007
  %13 = lshr i32 %.089, 1
  %.not12 = icmp ult i32 %.089, 2
  br i1 %.not12, label %._crit_edge, label %.lr.ph

._crit_edge:                                      ; preds = %10, %2
  %.0.lcssa = phi i64 [ 1, %2 ], [ %.1, %10 ]
  ret i64 %.0.lcssa
}

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 @_FortranAioOutputInteger64(ptr, i64) local_unnamed_addr

attributes #0 = { nofree norecurse 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"}
