Pagini recente » Cod sursa (job #183505) | Cod sursa (job #3191548) | Cod sursa (job #2033415) | Cod sursa (job #2332359) | Cod sursa (job #2216827)
#include<stdio.h>
#include<unordered_map>
#include<utility>
#include<vector>
#define MAX_TERMS 4
#define MAXL 1000007
#define MAXN 1024
FILE*fin,*fout;
void bkt(int level);
int N,L;
long long ans;
int v[MAXN+1];
int sol[MAX_TERMS+1];
//std::unordered_map<int,std::vector<std::pair<int,int> > > mp;
int ult=0;
std::vector<std::pair<short int,short int> > mp[MAXL+1];
int main()
{
fin=fopen("oite.in","r");
fout=fopen("oite.out","w");
fscanf(fin,"%d%d",&N,&L);
for(int i=1; i<=N; i++)
{
fscanf(fin,"%d",&v[i]);
}
for(int i=1; i<=N; i++)
{
for(int j=i+1; j<=N; j++)
{
if(v[i]+v[j]<=L)
{
mp[(v[i]+v[j])%MAXL].push_back(std::make_pair(i,j));
}
}
}
for(int i=1; i<=N; i++)
{
for(int j=i+1; j<=N; j++)
{
if(v[i]+v[j]<=L)
{
std::vector<std::pair<short int,short int > >::iterator beg=mp[(L-v[i]-v[j])%MAXL].begin();
std::vector<std::pair<short int,short int > >::iterator fin=mp[(L-v[i]-v[j])%MAXL].end();
for(std::vector<std::pair<short int,short int > >::iterator it=beg; it!=fin; it++)
{
if(i!=(it->first) && j!=(it->first) && i!=(it->second) && j!=(it->second))
{
ans++;
}
}
}
}
}
fprintf(fout,"%lld",ans/6);
fclose(fin);
fclose(fout);
return 0;
}
void bkt(int level)
{
if(level==MAX_TERMS+1)
{
long long sum=0;
for(int i=1; i<=MAX_TERMS; i++)
{
sum+=v[sol[i]];
}
if(sum==L)
{
ans++;
}
}
else
{
for(int i=sol[level-1]+1; i<=N-MAX_TERMS+level; i++)
{
sol[level]=i;
bkt(level+1);
}
}
}