Cod sursa(job #67623)

Utilizator blasterzMircea Dima blasterz Data 25 iunie 2007 12:48:41
Problema P-sir Scor 40
Compilator cpp Status done
Runda preONI 2007, Runda Finala, Clasele 11-12 Marime 1.41 kb
#include <cstdio>
#define maxn 800
#define mod (1<<32)
#define ull long long
#define ui unsigned int
ull dp[maxn][maxn];
unsigned int n;
unsigned int x[maxn];

long long const MOD=4294967296LL;
void citire()
{
	freopen("psir.in", "r", stdin);
	scanf("%d\n", &n);
	for(int i=1;i<=n;++i) scanf("%d ", x+i);
}

void dynamic()
{
  
	int i, j,k;
	long long s1,s,s2;
	for(i=1;i<n;i++)
		for(j=i+1;j<=n;++j)dp[i][j]=1;
	
	for(j=2;j<=n;++j)
		for(i=j+1;i<=n;++i)
		{
		//	printf("%d %d\n", j, i);
			 s1=(long long)x[i]-x[j];
			//if(s>0)
			{
				//printf("%d__ %d %d\n", x[j], x[i], x[i]-x[j]);
				
				for(k=1;k<j;++k)
				{
					s2=(long long)x[i]-x[k];
					s=(long long)s1*s2;
					if(s<0)
					  {
						
					    dp[j][i]+=dp[k][j];
					    //      dp[j][i]&=31;
					       while(dp[j][i]>MOD) dp[j][i]-=MOD;
					  }
				}
			}		
/*
			if(s<0)
			{
				
				for(k=1;k<j;++k)
					if(x[i]-x[k]>0)
						dp[j][i]+=dp[k][j];
			}
			 */
		}
       ull sum=0;
	for(i=1;i<n;++i)
		for(j=i+1;j<=n;++j)
		  { 
		    sum+=dp[i][j];
		    while(sum>MOD) sum-=MOD;
		  }

		    /*	
		for(i=1;i<=n;++i)
		{
			for(j=1;j<=n;++j)printf("%d ", dp[i][j]);
			printf("\n");
		}
*/
		printf("%lld\n", sum);
}

int main()
{
   freopen("psir.out", "w", stdout);
	citire();
	dynamic();
	long long t=1;
	for(int i=1;i<=32;++i) t*=2;
	//	printf("%lld\n", t);
       
	return 0;
}