Pagini recente » Cod sursa (job #3237395) | Cod sursa (job #2826378) | Cod sursa (job #1398141) | Cod sursa (job #3279230) | Cod sursa (job #682359)
Cod sursa(job #682359)
#include<cstdio>
#include<vector>
#include<algorithm>
#define infile "oite.in"
#define outfile "oite.out"
#define MOD 666013
#define pb push_back
#define ll long long
#define n_max 1030
#define FOR(g) \
for(vector < hash > ::iterator it = g.begin(); it!=g.end(); ++it)
#define FOR2(g) \
for(vector < ll > ::iterator it = g.begin(); it!=g.end(); ++it)
using namespace std;
struct hash {
int a, b;
ll s;
};
vector < hash > T[MOD];
vector < ll > T2[MOD];
ll v[n_max], L;
int N;
ll Sol;
vector < int > vx;
inline int h(ll x){
return x % MOD;}
void citeste()
{
freopen(infile,"r",stdin);
scanf("%d %lld",&N, &L);
for(int i=1; i <= N; ++i)
scanf("%lld",&v[i]);
fclose(stdin);
}
inline ll transf(int a, int b, int c, int d)
{
vx.clear();
vx.pb(a);
vx.pb(b);
vx.pb(c);
vx.pb(d);
sort(vx.begin(), vx.end());
ll where = 0;
for(int i=0; i<4; i++)
where = where * 10 + v[vx[i]];
return where;
}
inline int good(ll where, int a, int b, int c, int d)
{
if(a == c || a == d || b == c || b == d)
return 0;
FOR2(T2[h(where)])
if(*it == where)
return 0;
return 1;
}
void rezolva()
{
hash r;
ll part_sum;
for(int i=1; i<=N; ++i)
for(int j=i+1; j<=N; ++j)
if(v[i] + v[j] <= L)
{
r.a = i;
r.b = j;
r.s = v[i] + v[j];
T[h(r.s)].pb(r);
part_sum = L - r.s;
FOR(T[h(part_sum)])
if((*it).s == part_sum)
{
ll where = transf((*it).a, (*it).b, i, j);
if(good(where, (*it).a, (*it).b, i, j))
{
Sol++;
T2[h(where)].pb(where);
}
}
}
}
void afiseaza()
{
freopen(outfile,"w",stdout);
printf("%lld\n",Sol);
fclose(stdout);
}
int main()
{
citeste();
rezolva();
afiseaza();
return 0;
}