2014-09-19 47 views
0

这里是在SPOJ命名maxsub问题的代码SIGSEGV错误ideone

#include<iostream> 
#include<algorithm> 

using namespace std;long long pow(int n); 
int main() 
{ 
    int t; 
    cin>>t; 
    while(t--) 
    { 
     int n; 
     cin>>n; 
     long long int arr[n]; 
     for(int i=0;i<n;i++) 
     cin>>arr[i]; 
     sort(arr,arr+n); 
     int j=n-1; 
     if(arr[n-1]<0) 
     { 
      while(arr[j]==arr[j-1]) 
      { 

       j--; 
      } 
      cout<<arr[n-1]<<" "<<(n-j)<<endl; 
      j=n-1; 

     } 
     else if(arr[n-1]==0) 
     { 
      while(arr[j]==arr[j-1]) 
      { 

       j--; 
      } 
      cout<<arr[n-1]<<" "<<(pow((n-j))-1)%1000000009<<endl; 
      j=n-1; 
    } 
     else{ 
       long long int sum=0; 

       while(arr[j]>0){ 
        sum+=arr[j];j--; 
       } 
       int k=0; 
       if(arr[j]==0) 
       { k=1; 
        while(arr[j]==arr[j-1]) 
        { 
         j--;k++; 
        } 

       }cout<<sum<<" "<<pow((k)%1000000009)<<endl; 
     } 






    } 




} 
long long pow(int n) 
{ if(n==1) 
    { 
     return 2; 
    } 
    long long int m= pow(n/2); 
    if(n%2==0) 
    { 
     return (m*m)%1000000009; 
    } 
    else 
    { 
     return (m*m*2)%1000000009; 
    } 

} 

这段代码是给SIGSEGV错误,但如果我用这个替换上POW函数,那么这是工作精细。

long long pow(int n) 
{int i=1;long long sum=1; 
    while(n>=i) 
    { 
     sum=sum*2; 
     if(sum>=1000000009) 
     { 
      sum=sum%1000000009; 
     }i++; 
    } 
    return sum; 

} 

我使用递归的方式来找到力量来减少解决方案的运行时间。 但我无法获得它在ideone上的差异,这两者工作正常。

回答

0

您的递归不会终止,例如,当你拨打pow(0)