-4

正四面体が与えられます。すべてのエッジは、N 個の等しいセグメントに分割されました。この四面体の内部に、分割点に頂点を持つ縮退していない (|体積|>0) 四面体をいくつ構築できますか? 指定された四面体の頂点を分割点にすることはできません。

例:

  • N=2 の場合、答えは 12 です。
  • N=37 の場合、答えは 65561472 です。

ここにいくつかの疑似コードを含む答えがありますが、最終ステップを 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 でなければならない場合

4

1 に答える 1

2

1つの問題(実装に欠けているのはそれだけかもしれません)は、C ++(および他の多くの言語)でどのように正方形をとるかです。

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

^C ++の演算子は、2つの数値の累乗を評価しませんが、ビット単位のXORの組み合わせを評価します。2つの数値の二乗をとるには、2つの可能性があります。数値にそれ自体を掛けるか、2の累乗にします。整数の場合、数値の累乗をとると浮動小数点数になるため、最初の数値を優先する必要があります。

number_degen += histogram[fraction] * histogram[fraction];
于 2013-02-18T16:41:00.593 に答える