вот код для вопроса maxsub на spoj
#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;
}
Я использовал рекурсивный способ найти возможность просто сократить время выполнения решения. но я не могу понять, что он делает, а на идеоне оба работают нормально.
Ваша рекурсия не заканчивается, например, когда вы вызываете pow(0)
.