intpowM(int a, int t=mod-2){ int ret = 1; while(t) { if (t&1) ret = 1ll*ret*a %mod; a = 1ll*a*a %mod; t >>= 1; } return ret; } int fac[MaxN], ifac[MaxN]; intC(int n, int m){ return1ll*fac[n]*ifac[m]%mod*ifac[n-m]%mod; } voidInit(int n){ fac[0] = 1; for (int i=1; i<=n; i++) fac[i] = 1ll*fac[i-1]*i %mod; ifac[n] = powM(fac[n]); for (int i=n; i; i--) ifac[i-1] = 1ll*ifac[i]*i %mod; }
intT(int n,int m){ returnC(n+m-1, n-1); } int K; intR(int n,int m){ int ans=0; for (int i=0; i<=std::min(m/(K+1),n); i++) { if (i&1) ans =(ans-1ll*C(n,i)*T(n,m-i*(K+1))) %mod; else ans =(ans+1ll*C(n,i)*T(n,m-i*(K+1))) %mod; } return (ans+mod)%mod; } intS(int n, int m){ if (m<=K) returnC(n,m); int ans = 0; for (int i=0; i<=std::min(K,m); i++) ans = (ans+1ll*R(n-m-1,m-i)*(i+1)) %mod; return ans; }
intphi(int n){ int ans = n; for (int i=2; i*i<=n; i++) if (n%i==0) { ans=ans/i*(i-1); while(n%i==0)n/=i; } if (n>1) ans = ans/n*(n-1); return ans; } intgcd(int a, int b){ return !b ? a : gcd(b, a%b); }
intmain(){ int n, m; scanf("%d%d%d", &n, &m, &K); if (n==m) { puts(K>=m ? "1" : "0"); return0; } Init(n); int D = gcd(n,m), ans = 0; auto calcFactor = [&ans,n,m](int d) -> void { ans = (ans + 1ll*S(n/d,m/d)*phi(d)) %mod; }; for (int i=1; i*i<=D; i++) if (D%i==0) { calcFactor(i); if (i*i!=D) calcFactor(D/i); } ans = 1ll*ans*powM(n)%mod; printf("%d", ans); return0; }