SPOJ AGS运行时错误

时间:2015-01-20 21:30:30

标签: c

我在SPOJ上练习动态编程。我坚持这个名为AGS的问题。以下是我的代码。它在SPOJ上给出了运行时错误,但在我的计算机上运行得很好。请帮忙

#include<stdio.h>

long long mypow(long long base,long long exp,long long mod,long long log[])
{
    if(log[exp]!=0)
        return log[exp];
    if(exp==0)
        return 1;
    if(exp==1)
        return base%mod;

    long long ans = ((base%mod) * mypow(base,exp-1,mod,log))%mod;
    log[exp]=ans;
    return ans;

}

long long gpsum(long long r,long long k,long long mod,long long log[])
{
    if(k==0)
        return 1;
    if(k==1)
        return 1+r;

    long long ans=(mypow(r,k,mod,log)+gpsum(r,k-1,mod,log))%mod;
    return ans;
}
int main()
{
    long long i,t,k,a,d,r,n,mod,p,q,ans;
   scanf("%lld",&t);

 while(t--)
 {
       scanf("%lld %lld %lld",&a,&d,&r);
       scanf("%lld %lld",&n,&mod);
       long long log[n/2];
       for(i=0;i<n/2;i++)
        log[i]=0;


    if(n==1)
    {
        ans=a;
    }
    else if(n%2==0)
    {
    k=(n-2)/2;
    p=mypow(r,k,mod,log);
    q=gpsum(r,k,mod,log);
    ans=(((p%mod)*(a%mod))%mod+((q%mod)*(d%mod))%mod)%mod;
    }
    else
    {
    k=(n-3)/2;
    p=r*mypow(r,k,mod,log);
    q=r*gpsum(r,k,mod,log);
    ans=(((p%mod)*(a%mod))%mod+((q%mod)*(d%mod))%mod)%mod;
    }

    printf("%lld\n",ans);
 }
return 0;
}

1 个答案:

答案 0 :(得分:0)

它看起来像导致错误的行long long log[n/2];。对于n = 12345678(来自注释中的示例输入),它将尝试在堆栈上分配大约6M的long long,大约50Mb。我猜,这对于在线多用户编译器来说太大了。以下代码将证明此声明:

#include<stdio.h>

#define MAX 7000000
int main()
{
    volatile long long v[MAX];
    long i;
    for ( i=0; i<MAX; i++ )
        v[i]=i+1;
    printf("Hello");
    return 0;
}

所述MAX的值将在ideone上给出错误。减少值,比如700000将消除错误(不要介意易失性和循环练习,它们可以在优化器上进行操作)。 一个可能的解决方案是静态地分配这个内存,作为一个全局变量 - 在main函数之外,这样它将转到.data部分,而不是堆栈。这个解决方案:

#include<stdio.h>

#define MAX 7000000
volatile long long v[MAX];
int main()
{

    long i;
    for ( i=0; i<MAX; i++ )
        v[i]=i+1;
    printf("Hello");
    return 0;
}

即使数字较大也能正常工作。

相关问题