Cod sursa(job #16368)

Utilizator fireatmyselfBogdan-Alexandru Stoica fireatmyself Data 12 februarie 2007 21:54:45
Problema Triplete Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <stdio.h>
#define AMAX 4100
#define NMAX 140
#define MMAX 66000
#define B 31

int A[AMAX][NMAX], Cs[MMAX], Cd[MMAX], N, M;
int V[(1<<17)+10];

int main()
{
        int i, j, k, g, p, l, num = 0, cacat = 0;

        freopen("triplete.in", "r", stdin);
        scanf("%d %d", &N, &M);

        for (i = 0, l = (1<<17); i < l; i++, num = 0)
        {
            for (j = 0; j < 17; j++) num += ((i>>j)&1);
            V[i] = num;
        }

        for (k = 0; k < M; k++)
        {
                scanf("%d %d", &i, &j);
                Cs[k] = i; Cd[k] = j;
                p = j/B; g = j%B;
                A[i][p] += (1<<g);
                p = i/B; g = i%B;
                A[j][p] += (1<<g);
        }

        for (i = 31; i > 15; i--) cacat += (1<<i);

        for (i = num = 0; i < M; i++)
                for (j = 0; j <= M/B; j++)
                {
                        p = A[ Cs[i] ][j]&A[ Cd[i] ][j];
                        l = p>>15; num += V[l];
                        l = p-cacat; num += V[l];
                }

        freopen("triplete.out", "w", stdout);
        printf("%d\n", num/3);

        return 0;
        
}