Counting Triangles

#include<iostream>
#include<cstring>

using namespace std;

namespace GenHelper{
    unsigned z1,z2,z3,z4,b,u;
    unsigned get(){
        b=((z1<<6)^z1)>>13;
        z1=((z1&4294967294U)<<18)^b;
        b=((z2<<2)^z2)>>27;
        z2=((z2&4294967288U)<<2)^b;
        b=((z3<<13)^z3)>>21;
        z3=((z3&4294967280U)<<7)^b;
        b=((z4<<3)^z4)>>12;
        z4=((z4&4294967168U)<<13)^b;
        return (z1^z2^z3^z4);
    }
    bool read() {
      while (!u) u = get();
      bool res = u & 1;
      u >>= 1; return res;
    }
    void srand(int x){
        z1=x;
        z2=(~x)^0x233333333U;
        z3=x^0x1234598766U;
        z4=(~x)+51;
          u = 0;
    }
}
using namespace GenHelper;

typedef long long LL;

const int N=8010;

bool edge[N][N];

int main(){
      int n,seed;
      cin>>n>>seed;
      srand(seed);
      for(int i=0;i<n;i++)
        for(int j=i+1;j<n;j++)
            edge[j][i]=edge[i][j]=read();
    LL sum=0;
    for(int i=0;i<n;i++){
        LL tmp=0;
        for(int j=0;j<n;j++){
            if(i==j)    continue;
            tmp+=edge[i][j];
        }
        sum+=tmp*(n-1-tmp);
    }
    sum/=2;
    LL ans=1ll*n*(1ll*n-1)*(1ll*n-2)/6-sum;
    cout<<ans;
}

24dian

#include<iostream>
#include<cstring>
#include<vector>
#include<cmath>

using namespace std;

const double eps=1e-5;

int n,m;

double a[4];
bool vis[4];
bool has,tag;

void DFS(int d,bool flag){
    if(d==n){
        if(fabs(a[0]-m)<eps){
            has=true;
            if(!flag)    tag=true;
            return;
        }
    }
    for(int i=0;i<n;i++)    if(fabs(floor(a[i])-a[i])>eps)    flag=true;
    for(int i=0;i<n;i++)
        for(int j=i+1;j<n;j++){
            if(vis[i]||vis[j])    continue;
            double x=a[i],y=a[j];
            vis[j]=true;
            a[i]=x+y;DFS(d+1,flag);
            a[i]=x-y;DFS(d+1,flag);
            a[i]=y-x;DFS(d+1,flag);
            a[i]=x*y;DFS(d+1,flag);
            if(fabs(y)>eps){
                a[i]=x/y;
                DFS(d+1,flag);
            }
            if(fabs(x)>eps){
                a[i]=y/x;
                DFS(d+1,flag);
            }
            a[i]=x,a[j]=y;
            vis[j]=false;
        }
}

struct node{
    int a[4];
};
vector<node> v;

void dfs(int d,int lst){
    if(d==n){
        has=tag=false;
        DFS(1,false);
        if(has&&!tag)    v.push_back({(int)a[0],(int)a[1],(int)a[2],(int)a[3]});
        return;
    }
    for(int i=lst;i<=13;i++){
        a[d]=i;
        dfs(d+1,i);
    }
}

int main(){
    scanf("%d%d",&n,&m);
    dfs(0,1);
    printf("%d\n",v.size());
    for(int i=0;i<v.size();i++){
        for(int j=0;j<n;j++)    printf("%d ",v[i].a[j]);
        puts("");
    }
}