四面体师

时间:2013-02-18 16:27:15

标签: c++ algorithm math

  

给定正四面体。所有边缘被分成N个相等的段。在这个四面体内部可以建立多少个具有顶点的非退化(|体积|> 0)四面体?给定四面体的顶点不能作为除法点。

示例:

  • 对于N = 2,答案是12。
  • 对于N = 37,答案是65561472。

Here is the answer with some pseudo-code,但我没有将最后一步转换为C ++。这是我到目前为止所做的:

typedef unsigned long long ulong;
ulong histogram[3002];

int main() {
    memset(&histogram[0],0,sizeof(ulong)*3002);
    ulong N;
    cin >> N;
    ulong m = N-1;
    ulong u,U,z,Z;
    ulong tetra = 3*m*m*(53*m*m-34*m+1)/4;

    for( u = 1; u < N; u++) {
        U = u/(N-u);
        for( z = 1; z < N; z++) {
            Z = z/(N-z);
            histogram[U*Z]++;
        }
    }

    // How to write the following steps in C++?
    /*number_degen = 0;
    foreach fraction in histogram {
        number_degen += histogram{fraction}^2;
    }*/
    // I am trying something like this
    ulong number_degen = 0;
    for (int i = 0; i<3002; i++)
        number_degen += histogram[i] * histogram[i];


    cout<<number_degen<<endl;
    cout<<tetra-3*number_degen<<endl;
}

“number_degen”=“950404”如果N = 37,则必须是4836

1 个答案:

答案 0 :(得分:2)

一个问题(可能是你的实现中唯一缺少的)就是你如何使用C ++(以及许多其他语言)中的方块:

number_degen += histogram[fraction] ^ 2;    // <-- wrong!

C ++中的^运算符将评估两个数字的幂,但是它们的按位XOR组合。要取两个数字的平方,您有两种可能性:将数字乘以其自身或将其乘以2的幂。对于整数,第一个应该是首选,因为取一个数的幂会产生一个浮点数。

number_degen += histogram[fraction] * histogram[fraction];