← Home
package main

import (
	"fmt"
	"math/bits"
)

func mulMod(a, b, m int64) int64 {
	hi, lo := bits.Mul64(uint64(a), uint64(b))
	_, rem := bits.Div64(hi, lo, uint64(m))
	return int64(rem)
}

func powerMod(base, exp, mod int64) int64 {
	res := int64(1)
	base %= mod
	for exp > 0 {
		if exp%2 == 1 {
			res = mulMod(res, base, mod)
		}
		base = mulMod(base, base, mod)
		exp /= 2
	}
	return res
}

func factorizeDistinct(n int64) []int64 {
	var factors []int64
	if n%2 == 0 {
		factors = append(factors, 2)
		for n%2 == 0 {
			n /= 2
		}
	}
	for i := int64(3); i*i <= n; i += 2 {
		if n%i == 0 {
			factors = append(factors, i)
			for n%i == 0 {
				n /= i
			}
		}
	}
	if n > 1 {
		factors = append(factors, n)
	}
	return factors
}

func getPhiFactors(p, e int64) []int64 {
	factors := factorizeDistinct(p - 1)
	if e > 1 {
		found := false
		for _, q := range factors {
			if q == p {
				found = true
				break
			}
		}
		if !found {
			factors = append(factors, p)
		}
	}
	return factors
}

func gcd(a, b int64) int64 {
	for b != 0 {
		a, b = b, a%b
	}
	return a
}

func lcm(a, b int64) int64 {
	if a == 0 || b == 0 {
		return 0
	}
	return a / gcd(a, b) * b
}

func main() {
	var m, x int64
	if _, err := fmt.Scan(&m, &x); err != nil {
		return
	}

	mTemp := m
	var pFactors []int64
	var aFactors []int64
	if mTemp%2 == 0 {
		pFactors = append(pFactors, 2)
		count := int64(0)
		for mTemp%2 == 0 {
			count++
			mTemp /= 2
		}
		aFactors = append(aFactors, count)
	}
	for i := int64(3); i*i <= mTemp; i += 2 {
		if mTemp%i == 0 {
			pFactors = append(pFactors, i)
			count := int64(0)
			for mTemp%i == 0 {
				count++
				mTemp /= i
			}
			aFactors = append(aFactors, count)
		}
	}
	if mTemp > 1 {
		pFactors = append(pFactors, mTemp)
		aFactors = append(aFactors, 1)
	}

	var kMat [][]int64
	var phiMat [][]int64

	for i, p := range pFactors {
		var pArr []int64
		var kArr []int64
		a := aFactors[i]
		phi := int64(1)
		mod := int64(1)
		for e := int64(1); e <= a; e++ {
			if e == 1 {
				phi = p - 1
			} else {
				phi *= p
			}
			mod *= p

			K := phi
			phiFactors := getPhiFactors(p, e)
			for _, q := range phiFactors {
				for K%q == 0 {
					if powerMod(x, K/q, mod) == 1 {
						K /= q
					} else {
						break
					}
				}
			}
			kArr = append(kArr, K)
			pArr = append(pArr, phi)
		}
		kMat = append(kMat, kArr)
		phiMat = append(phiMat, pArr)
	}

	var ans int64 = 0
	var dfs func(idx int, currentPhi int64, currentK int64)
	dfs = func(idx int, currentPhi int64, currentK int64) {
		if idx == len(pFactors) {
			ans += currentPhi / currentK
			return
		}

		dfs(idx+1, currentPhi, currentK)

		for e := int64(1); e <= aFactors[idx]; e++ {
			nextPhi := currentPhi * phiMat[idx][e-1]
			nextK := lcm(currentK, kMat[idx][e-1])
			dfs(idx+1, nextPhi, nextK)
		}
	}

	dfs(0, 1, 1)
	fmt.Println(ans)
}