module md contains function mul(a,b,mo) implicit none integer::i,j,k,h,w,m integer(kind=8),intent(in)::a(:,:),b(:,:),mo integer(kind=8),allocatable::mul(:,:) h=size(a)/size(a(0,:)) w=size(b(0,:)) m=size(b)/size(b(0,:)) allocate(mul(h,w)) do i=1,h do j=1,w mul(i,j)=0 end do end do do i=1,h do j=1,w do k=1,m mul(i,j)=mul(i,j)+mod(a(i,k)*b(k,j),mo) mul(i,j)=mod(mul(i,j),mo) end do end do end do end function function pow(a,n,mo) integer(kind=8),value::n,mo integer(kind=8)::a(:,:) integer(kind=8)::pow(2,2) do i=1,2 do j=1,2 if(i==j)then pow(i,j)=1 else pow(i,j)=0 end if end do end do do while(n>0) if(mod(n,2)==1)pow=mul(pow,a,mo) n=n/2 a=mul(a,a,mo) end do end function function inv(a,mo) integer(kind=8)::mo integer(kind=8)::a(:,:) integer(kind=8),allocatable::inv(:,:) inv=pow(a,mo-2,mo) end function end module program main use md implicit none integer(kind=8)::b,c,d integer(kind=8)::ans,mat(2,2),vec(2,1) integer(kind=8),parameter::mo=1000000007 read*,b,c,d b=mod(b,mo) c=mod(c,mo) vec(1,1)=0 vec(2,1)=b mat(1,1)=c mat(1,2)=c mat(2,1)=0 mat(2,2)=1 mat=pow(mat,d,mo) vec=mul(mat,vec,mo) print*,vec(1,1) end program