【问题标题】:Euler 160 : Find the non trivial 5 digits of the factorialEuler 160:找到阶乘的非平凡 5 位数字
【发布时间】:2012-02-17 18:55:58
【问题描述】:

给定一个数字,找出尾随 0. 9 之前的 5 位数字! = 362880 所以 f(9)=36288 10! = 3628800 所以 f(10)=36288 20! = 2432902008176640000 所以 f(20)=17664 求 f(1,000,000,000,000)

为此,我计算了f(10^6),然后计算f(10^12) = (f(10^6))^(10^6) 用于计算f(n) ...我正在计算 通过删除任何 5 和相应的 2 来阶乘,这样所有 尾随零被删除。
但我得到了错误的答案。
方法有问题还是一些愚蠢的错误?

参考代码

long long po(long long n, long long m, long long mod) {
    if (m == 0) return 1;
    if (m == 1) return n % mod;
    long long r = po(n, m / 2, mod) % mod;
    if (m % 2 == 0) return (r * r) % mod;
    return (((r * r) % mod) * n) % mod;
}

void foo() {
    unsigned long long i, res = 1, m = 1000000 , c = 0, j, res1 = 1, mod;
    mod = ceil(pow(10, 9));
    cout << mod << endl;
    long long a = 0, a2 = 0, a5 = 0;
    for (i = 1 ; i <= m; i++) {
        j = i;
        while (j % 10 == 0)
            j /= 10;
        while (j % 2 == 0) {
            j /= 2;
            a2++;
        }
        while (j % 5 == 0) {
            j /= 5;
            a5++;
        }
        res = (res * j ) % mod;
    }

    a = a2 - a5;

    for (i = 1; i <= a; i++)
        res = (res * 2) % mod;
    for (i = 1; i <= 1000000; i++) {
        res1 = (res1 * res) % mod;
    }
    cout << res1 << endl;
}

【问题讨论】:

  • 另外,欧拉项目是不是你应该自己解决而不是寻求帮助......只是说如果你让别人为你解决它,你不仅不会从中得到任何东西,而且现在答案也将在 SO 上供大家查看。

标签: c algorithm math


【解决方案1】:

你的平等 f(10^12) = (f(10^6))^(10^6) 是错误的。 f() 基于阶乘,而不是幂。

【讨论】:

  • 我的假设:我们已经计算出 (10^6) 的最后 5 位数字!现在所有其他 > 10^6 的数字将具有与我们计算 (10^6) 相同的 5 个尾随数字!所以 f(2*(10^6) ) = f(10^6)! * f(10^6) 以类似的方式 f(n*10^6) = (f(10^6))^n
  • @titan:但数字中的尾随零意味着您不能这样对待整个问题模块 1000000。例如,前一百万中的 123000 对 5 的贡献与 1123000 不同,因此它们不等价。
【解决方案2】:

你的假设是错误的:

  • f(10^12)f(10^6)^(10^6) 不同。
  • 为了得到阶乘的低位非 0 位,从被乘数中删除 1025 的所有倍数是不够的。删除 10 的倍数是个好主意,对于 52,只有当另一个被乘数分别是 5 和 2 的倍数时,才应该删除因子 2 或 5。

您应该简化代码并计算模数 10 的某个幂,但 10^9 似乎太高了,因为 10^9 * 10^12 会溢出 64 位类型unsigned long long

【讨论】:

    猜你喜欢
    • 2021-08-07
    • 2021-12-23
    • 1970-01-01
    • 2021-09-11
    • 2021-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多