1

我正在尝试学习template用 C++ 实现。当我将我的 NTT(数论变换)代码更改为使用的代码template时,如下所示:

template <long long mod> struct NTT{
    int x = 0;
    NTT(){
        long long p = mod-1;
        while(!(p % 2)){
            p >>= 1;
            ++x;
        }       
    }   
    const static long long root_pw = 1 << x;
//(there is a function after this that also needs to read the value 'root_pw')
};

signed main()
{
    NTT<998244353> ntt1;
    vector<long long> a(ntt1::root_pw,0);
}

它告诉我做 x static

当我这样做时,它告诉我制作 x const,这击败了 x 首先存在的原因。

如果有帮助,我使用(GNU C++11)和我的编译器(Dev-C++ 5.11)设置为配置(TDM-GCC 4.9.2 64 位版本)。

我真的很想完成这项工作,但我不知道该怎么做。

这可能是愚蠢的容易,但正是我错过了什么?

先感谢您。

4

1 回答 1

3

您可以替换 C++14 函数

template <long long mod>
constexpr int f()
{
    int x = 0;
    long long p = mod-1;
    while(!(p % 2)){
        p >>= 1;
        ++x;
    }       
    return x;
}

通过 C++11 版本:

template <long long p>
constexpr int f2()
{
    return p % 2 ? 0 : 1 + f2<p / 2>();
}

template <long long mod>
constexpr int f()
{
    return f2<mod - 1>();
}

所以

template <long long mod>
struct NTT{
    constexpr static const long long root_pw = 1LL << f<mod>();

};

演示

于 2020-01-30T22:43:41.667 回答