← Home
package main

import (
	"bufio"
	"fmt"
	"os"
)

const MOD int64 = 1000000007

var tVal, aVal, den int64
var powT, powA []int64

func digitSumBase(n, base int64) int64 {
	var s int64
	for n > 0 {
		s += n % base
		n /= base
	}
	return s
}

func linearCount(remA, remB int64) int64 {
	num := remB - remA
	if num%den != 0 {
		return 0
	}
	c1 := num / den
	if c1 < 0 {
		return 0
	}
	c0 := remA - c1*tVal
	if c0 < 0 {
		return 0
	}
	return 1
}

func tailCount(remA, remB int64) int64 {
	num := remB - remA
	if num%den != 0 {
		return 0
	}
	k := num / den
	if k < 0 {
		return 0
	}
	high := k / (aVal + tVal)
	low := int64(0)
	need := tVal*k - remA
	if need > 0 {
		d := tVal * aVal
		low = (need + d - 1) / d
	}
	if low > high {
		return 0
	}
	return (high - low + 1) % MOD
}

func dfs(i int, remA, remB int64) int64 {
	if i < 2 {
		return linearCount(remA, remB)
	}
	if i == 2 {
		return tailCount(remA, remB)
	}
	maxc := remA / powT[i]
	if x := remB / powA[i]; x < maxc {
		maxc = x
	}
	var ans int64
	pt := powT[i]
	pa := powA[i]
	for c := int64(0); c <= maxc; c++ {
		ans += dfs(i-1, remA-c*pt, remB-c*pa)
		if ans >= MOD {
			ans -= MOD
		}
	}
	return ans
}

func main() {
	in := bufio.NewReaderSize(os.Stdin, 1<<20)
	out := bufio.NewWriterSize(os.Stdout, 1<<20)
	defer out.Flush()

	var t, a, b int64
	fmt.Fscan(in, &t, &a, &b)

	if t == 1 {
		if a == 1 {
			if b == 1 {
				fmt.Fprint(out, "inf")
			} else {
				fmt.Fprint(out, 0)
			}
			return
		}
		s := digitSumBase(b, a)
		if s == a || (s == 1 && b >= a) {
			fmt.Fprint(out, 1)
		} else {
			fmt.Fprint(out, 0)
		}
		return
	}

	if a == t {
		if b == a {
			fmt.Fprint(out, 2)
		} else {
			fmt.Fprint(out, 0)
		}
		return
	}

	tVal = t
	aVal = a
	den = a - t

	num := b - a
	if num%den != 0 || num/den < 0 {
		fmt.Fprint(out, 0)
		return
	}

	powT = []int64{1}
	powA = []int64{1}
	N := 0
	curT, curA := int64(1), int64(1)
	for i := 1; i < 64; i++ {
		if curT > a/t {
			curT = a + 1
		} else {
			curT *= t
		}
		if curA > b/a {
			curA = b + 1
		} else {
			curA *= a
		}
		powT = append(powT, curT)
		powA = append(powA, curA)
		if curT <= a && curA <= b {
			N = i
		} else {
			break
		}
	}

	fmt.Fprint(out, dfs(N, a, b)%MOD)
}