【问题标题】:solution of spoj NAJPWG. Gives TLEspoj NAJPWG 的解决方案。给 TLE
【发布时间】:2015-06-08 21:06:26
【问题描述】:

问题的链接是 - spoj question

我尝试通过这种方法解决问题 - N 范围内的对数 = N-1 范围内的对数 + 一些新对。

但我不知道还应该在此处进行哪些优化以避免 TLE。我还阅读了有关 euler totient 函数的信息,但无法真正理解这种方法。我已经阅读了 4 种计算欧拉 phi 的方法,但我猜都需要相同的 O(n^2)。

P.S - 我只是想知道关于应该采用什么方法而不是直接解决方案的提示。提示会做。 提前非常感谢。

我对这个问题的代码是 -

#include<stdio.h>
typedef unsigned long long int ull;
ull a[100000] = {0};

inline ull g()
{
    ull n=0;
    char ch;
    ch = getchar_unlocked();
    while(ch < '0' || ch > '9')
        ch = getchar_unlocked();
    while(ch >= '0' && ch <= '9') {
        n = (n<<3) + (n<<1) + (ch - '0');
        ch = getchar_unlocked();
    }
    return n;
}

ull gcd( ull a , ull b)
{
    if(b == 0)
        return a;
    else 
        return gcd(b , a % b);
}

ull find(ull n)
{
    if(n == 0 || n == 1)
        return n;
    else if(a[n] != 0)
        return n;
    else
        return find(n-1);
}

ull range(ull n)
{
    ull c, i, nf,t;
    nf = find(n);
    c = a[nf];
    t = nf;
    nf++;
    while(nf <= n) {
        a[nf] = a[t];
        for(i = 2 ; i <= nf ; i++) {
            ull gd = gcd(i,nf);
            if(gd > 1) {
                c++;
                a[nf]++;
            }
        }
        nf++;
    }
    return c;
}

int main()
{
    ull t = g();
    ull i = 1;
    while(t--) {
        ull n = g();
        if(a[n] == 0)
            a[n] = range(n);
        printf("Case %llu: %llu\n",i++,a[n]);
    }   
    return 0;
}

【问题讨论】:

  • 如果您发布代码,请至少解释一下您的变量!
  • @ShubhamSharma 对此感到抱歉。下次我会记住这一点。

标签: c algorithm greatest-common-divisor


【解决方案1】:

去尝试一下并获得交流电。

正如你所说的只是提示,这里有一些基于我的 AC 解决方案和你的尝试:

  1. Phi 函数是O(n^2)?真的吗?至少在我的代码中,我认为不是O(n^2)
  2. 不需要GCD 函数
  3. 这是一个简单的数学/数论问题,而不是 DP 问题
  4. 预计算,预计算,预计算!你可以预先计算很多东西,比如循环每个输入n,你可以在O(1)中输出答案!
  5. 在研究 Phi 函数之前,请先学习 Prime Sieve 和算术基本定理。 (或者你可以只记住Phi函数的公式,确实很容易记住)

【讨论】:

  • 正如我所说,我对 DP 真的很陌生,刚刚读过它,直到现在还没有提出任何问题,所以对此的想法非常模糊。另一方面,我是通过预先计算每个 phi( n) 直到 10^5,获得交流电。谢谢。
  • @AyushiArora 恭喜!不断学习会让你成功:)
  • 并且还计算了之前使用筛子的素数。谢谢。
【解决方案2】:

嗯,我认为更好的方法是根据欧拉的 Totient 函数来考虑它... 1 哪里

x

现在直到 n 的对是 Pairs until n-1 + Pairs with n i.e (n- Totient function of n)。

Totient 功能请参考Link

我认为您需要在 Totient Sieve 的帮助下将每个数字的 totient 预处理到 10^6,因为 N* Root (N) 不会及时通过。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多