#include using namespace std; typedef long long int s64; s64 N = 100000000000000LL; s64 M = 10000000LL; s64 D = 12; s64 Pow(s64 base, s64 exp) { s64 ret = 1; for (s64 i = 0; i < exp; i ++) ret *= base; return ret; } s64 GCD(s64 x, s64 y){ return x ? GCD(y % x, x) : y; } s64 Naive() { s64 r = 0; for (s64 n=1; n<=N; n++) { for (s64 d=1; d<=N; d++) { s64 g = GCD(n, d); s64 m = d / g; s64 a2 = 0, a5 = 0; while (m%2 == 0) { m /= 2; a2 ++; } while (m%5 == 0) { m /= 5; a5 ++; } if (m != 1) continue; if (max(a2,a5) != D) continue; r ++; } } return r; } s64 Func1(s64 d) { s64 r = 0, k; r += (N/d) * (d - d/5); for (s64 m=d+1; ; m+=1) { if (m%5==0) continue; k = N / m; if (k <= M) break; r += k; } for (; k>0; k--) { s64 n1 = N/k - max(N/(k+1), d); s64 n2 = N/k/5 - max(N/(k+1)/5, d/5); r += k * (n1 - n2); } return r; } s64 Func2(s64 d) { s64 r = 0, k; r += (N/d) * (d/2); for (s64 m=d+1; ; m+=2) { k = N / m; if (k <= M) break; r += k; } for (; k>0; k--) { s64 n = (N/k-1)/2 - max((N/(k+1)-1)/2, (d-1)/2); r += k * n; } return r; } s64 Func3(s64 d) { s64 k; s64 r = (N/d) * ((d-1)/2 - (d-5)/10); for (s64 m=(d%2==0)?d+1:d+2; ; m+=2) { if (m%5==0) continue; k = N / m; if (k <= M) break; r += k; } for (; k>0; k--) { s64 n1 = (N/k-1)/2 - max((N/(k+1)-1)/2, (d-1)/2); s64 n2 = (N/k-5)/10 - max((N/(k+1)-5)/10, (d-5)/10); r += k * (n1 - n2); } return r; } s64 Smart() { s64 r = Func1(Pow(5, D)) + Func2(Pow(2, D)); for (s64 q=1; q<=D-1; q++) { s64 r0 = Func3(Pow(2, D) * Pow(5, q)); if (r0 == 0) break; r += r0; } for (s64 p=1; p<=D; p++) { s64 r0 = Func3(Pow(2, p) * Pow(5, D)); if (r0 == 0) break; r += r0; } return r; } int main() { s64 r = Smart(); cout << "C(" << N << "," << D << ") = " << r << endl; }