//Pratik Dayama - TRIDIM
#include <stdio.h>
#define MOD 1000000007
#define access(i,j) ((i)*(i+1))/2+j //macro to access 1D array with 2D indexing
long long pow2[1001]; //2^x storage
long long tri[1000001]; //to store input triangle
int compute[1000001]; //aux array to store path
//compute and store 2^0 to 2^(n-1) modulo MOD
void power(int n)
{
long long a = 1;
int i;
for(i = 0; i < n; i++)
{
pow2[i] = a;
a = (a*2) % MOD;
}
}
int main()
{
int n, i, j;
power(n);
for(i = 0; i < (n*(n+1))/2; i++)
for(i = n-1; i > 0; i--) //starting from the bottom row
{
for(j = 0; j < i; j++)
{
//compare adjacent pairs, add the larger one to the value above
if(tri[access(i, j)] < tri[access(i, j+1)])
{
tri[access(i-1, j)] = tri[access(i-1, j)] + tri[access(i, j+1)];
compute[access(i-1, j)] = 1; //indicates right turn
}
else
{
tri[access(i-1, j)] = tri[access(i-1, j)] + tri[access(i, j)];
compute[access(i-1, j)] = 0; //indicates left turn
}
}
}
long long sum = 1; //1 for the max path itself
i = 0;
j = 0;
while(1) //calculate number of paths before max path
{
while(compute[access(i, j)] == 0 && i < n) //left path
i++;
if(i > n) //reached end
break;
//right path
i++;
j++;
sum = (sum + pow2[n-i-1]) % MOD; //add number of paths on the left
}
return 0;
}
Ly9QcmF0aWsgRGF5YW1hIC0gVFJJRElNCiNpbmNsdWRlIDxzdGRpby5oPgojZGVmaW5lIE1PRCAxMDAwMDAwMDA3CiNkZWZpbmUgYWNjZXNzKGksaikgKChpKSooaSsxKSkvMitqIC8vbWFjcm8gdG8gYWNjZXNzIDFEIGFycmF5IHdpdGggMkQgaW5kZXhpbmcKCmxvbmcgbG9uZyBwb3cyWzEwMDFdOyAgIC8vMl54IHN0b3JhZ2UKbG9uZyBsb25nIHRyaVsxMDAwMDAxXTsgLy90byBzdG9yZSBpbnB1dCB0cmlhbmdsZQppbnQgY29tcHV0ZVsxMDAwMDAxXTsgICAvL2F1eCBhcnJheSB0byBzdG9yZSBwYXRoCgovL2NvbXB1dGUgYW5kIHN0b3JlIDJeMCB0byAyXihuLTEpIG1vZHVsbyBNT0QKdm9pZCBwb3dlcihpbnQgbikKewogICAgbG9uZyBsb25nIGEgPSAxOwogICAgaW50IGk7CiAgICBmb3IoaSA9IDA7IGkgPCBuOyBpKyspCiAgICB7CiAgICAgICAgcG93MltpXSA9IGE7CiAgICAgICAgYSA9IChhKjIpICUgTU9EOwogICAgfQp9CgppbnQgbWFpbigpCnsKICAgIGludCBuLCBpLCBqOwogICAgc2NhbmYoIiVkIiwgJm4pOwogICAgcG93ZXIobik7CiAgICBmb3IoaSA9IDA7IGkgPCAobioobisxKSkvMjsgaSsrKQogICAgICAgIHNjYW5mKCIlbGxkIiwgJnRyaVtpXSk7CgogICAgZm9yKGkgPSBuLTE7IGkgPiAwOyBpLS0pIC8vc3RhcnRpbmcgZnJvbSB0aGUgYm90dG9tIHJvdwogICAgewogICAgICAgIGZvcihqID0gMDsgaiA8IGk7IGorKykKICAgICAgICB7CiAgICAgICAgICAgIC8vY29tcGFyZSBhZGphY2VudCBwYWlycywgYWRkIHRoZSBsYXJnZXIgb25lIHRvIHRoZSB2YWx1ZSBhYm92ZQogICAgICAgICAgICBpZih0cmlbYWNjZXNzKGksIGopXSA8IHRyaVthY2Nlc3MoaSwgaisxKV0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRyaVthY2Nlc3MoaS0xLCBqKV0gPSB0cmlbYWNjZXNzKGktMSwgaildICsgdHJpW2FjY2VzcyhpLCBqKzEpXTsKICAgICAgICAgICAgICAgIGNvbXB1dGVbYWNjZXNzKGktMSwgaildID0gMTsgLy9pbmRpY2F0ZXMgcmlnaHQgdHVybgogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdHJpW2FjY2VzcyhpLTEsIGopXSA9IHRyaVthY2Nlc3MoaS0xLCBqKV0gKyB0cmlbYWNjZXNzKGksIGopXTsKICAgICAgICAgICAgICAgIGNvbXB1dGVbYWNjZXNzKGktMSwgaildID0gMDsgLy9pbmRpY2F0ZXMgbGVmdCB0dXJuCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbG9uZyBsb25nIHN1bSA9IDE7IC8vMSBmb3IgdGhlIG1heCBwYXRoIGl0c2VsZgogICAgaSA9IDA7CiAgICBqID0gMDsKICAgIHdoaWxlKDEpIC8vY2FsY3VsYXRlIG51bWJlciBvZiBwYXRocyBiZWZvcmUgbWF4IHBhdGgKICAgIHsKICAgICAgICB3aGlsZShjb21wdXRlW2FjY2VzcyhpLCBqKV0gPT0gMCAmJiBpIDwgbikgLy9sZWZ0IHBhdGgKICAgICAgICAgICAgaSsrOwogICAgICAgIGlmKGkgPiBuKSAvL3JlYWNoZWQgZW5kCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIC8vcmlnaHQgcGF0aAogICAgICAgIGkrKzsKICAgICAgICBqKys7CiAgICAgICAgc3VtID0gKHN1bSArIHBvdzJbbi1pLTFdKSAlIE1PRDsgLy9hZGQgbnVtYmVyIG9mIHBhdGhzIG9uIHRoZSBsZWZ0CiAgICB9CiAgICBwcmludGYoIiVsbGQiLCBzdW0pOwoJcmV0dXJuIDA7Cn0=