Pagini recente » Cod sursa (job #2643883) | Cod sursa (job #894865) | Cod sursa (job #1502180) | Cod sursa (job #2308378) | Cod sursa (job #14328)
Cod sursa(job #14328)
#include<stdio.h>
#define fin "triplete.in"
#define fout "triplete.out"
#define Nmax 4097
#define Bmax 257
#define Nrmax 1<<16
#define Lmax 65537
int n,m,sol,v[Nmax][Bmax],nrb[Nrmax+1],list[Lmax][2];
FILE *in,*out;
void insert(int a,int b) {
int p1,p2;
p1=a/16;
p2=a%16;
p2=1<<p2;
v[b][p1]=v[b][p1]|p2;
}
int main() {
int i,j,a,b,bit,lim,tmp;
in=fopen(fin,"r"); out=fopen(fout,"w");
fscanf(in,"%i%i",&n,&m);
for (i=1;i<=m;++i) {
fscanf(in,"%i%i",&a,&b);
--a; --b;
insert(a,b);
insert(b,a);
list[i][0]=a;
list[i][1]=b;
}
nrb[1]=1;
for (i=2;i<=Nrmax;) {
j=i;
lim=i<<1;
for (j=i;j<lim;++j) nrb[j]=1+nrb[j-i];
i=lim;
}
/*
for (i=0;i<32;++i) printf("%i ",nrb[i]);
for (i=0;i<n;++i) {
for (int j=0;j<=16;++j) {
bit=v[i][0]&(1<<j);
if (bit) bit=1;
printf("%i",bit);
}
printf("\n");
}
*/
for (i=1;i<=m;++i) {
a=list[i][0]; b=list[i][1];
for (j=0;j<Bmax;++j) {
tmp=v[a][j]&v[b][j];
sol+=nrb[tmp];
}
}
sol/=3;
fprintf(out,"%i\n",sol);
fclose(in); fclose(out);
return 0;
}