Cod sursa(job #8604)

Utilizator azotlichidAdrian Vladu azotlichid Data 25 ianuarie 2007 01:35:35
Problema Triplete Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.87 kb
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <vector>
using namespace std;

#define FOR(i, a, b) for (i = (a); i <= (b); i ++)
#define REP(i, n)    for (i =   0; i <  (n); i ++)
#define PB			 push_back

#define NMAX 2048
#define MMAX 65536

int N, M, i, j, k;
int a[MMAX], b[MMAX], nr[65536], f[NMAX][64];

inline int nb(int x)
{
		return nr[x & 65535] + nr[x >> 16];
}

int main(void)
{
	freopen("triplete.in", "r", stdin);
	freopen("triplete.out", "w", stdout);

	nr[0] = 0;
	FOR(i, 1, 65535) nr[i] = nr[i >> 1] + (i & 1);

	memset(f, 0, sizeof(f));
	scanf("%d %d", &N, &M);
	REP(k, M)
	{
		scanf("%d %d", &i, &j);
		f[i][j >> 5] |= (1 << (j & 31));
		f[j][i >> 5] |= (1 << (i & 31));
		a[k] = i, b[k] = j;
	}

	int Ans = 0;
	REP(i, M) FOR(k, 0, 63)
		Ans += nb(f[a[i]][k] & f[b[i]][k]);

	printf("%d\n", Ans/3);
	return 0;
}