typedef struct {
int val;
int isCombine;
}NodeInfor;
int kConcatenationMaxSum(int* arr, int arrSize, int k){
NodeInfor * dp = 0;
int rtVal = 0;
int i;
int uintSum = 0;
int curMax = 0;
int curIndex = 0;
long long tmp = 0;
dp = malloc(sizeof(NodeInfor) * arrSize * 2);
memset(dp, 0, sizeof(NodeInfor) * arrSize * 2);
dp[0].val = arr[0];
uintSum = arr[0];
curMax = arr[0];
for(i = 1; i < arrSize; i++)
{
if(dp[i - 1].val > 0)
{
dp[i].val = dp[i - 1].val + arr[i];
}
else
{
dp[i].val = arr[i];
}
uintSum += arr[i];
if(dp[i].val > curMax)
{
curMax = dp[i].val;
curIndex = i;
}
}
if((dp[arrSize - 1].val > 0) && (k > 1))
{
for(i = 0; i < arrSize; i++)
{
if(i == 0)
{
dp[arrSize].val = dp[arrSize - 1].val + arr[0];
dp[arrSize].isCombine = 1;
}
else
{
if(dp[arrSize + i - 1].val > 0)
{
dp[arrSize + i].val = dp[arrSize + i - 1].val + arr[i];
dp[arrSize + i].isCombine = 1;
}
else
{
dp[arrSize + i].val = arr[i];
}
}
if(dp[arrSize + i].val > curMax)
{
curMax = dp[arrSize + i].val;
curIndex = arrSize + i;
}
}
}
//printf("curMax = %d, curIndex = %d.\n", curMax, curIndex);
if(curMax > 0)
{
rtVal = curMax;
if((uintSum > 0) && (k > 2) && (dp[curIndex].isCombine == 1))
{
tmp = (long long)curMax + (long long)uintSum * (long long)(k - 2);
rtVal = tmp % 1000000007;
}
}
else
{
rtVal = 0;
}
free(dp);
return rtVal;
}