lsmCC 发表于 2023-11-27 22:11:12

模运算模板

using num=modnum<int(1e9)+7>;
第一次遇到这个不知道是什么意思,
应该是取模运算,但不会写模板,求一个与之对应的

FishC_GPT 发表于 2023-11-27 22:11:31

模运算模板是用于进行取模运算的代码模块。在C++中可以使用模板类来实现。下面是一个简单的取模运算模板示例:

template <int MOD>
class ModNum {
private:
    int value;
   
public:
    ModNum(int v=0) : value(v % MOD) {
      if (value < 0) {
            value += MOD;
      }
    }
   
    // 定义取模运算符重载
    ModNum operator+(const ModNum<MOD>& other) const {
      return ModNum(value + other.value);
    }
   
    ModNum operator-(const ModNum<MOD>& other) const {
      return ModNum(value - other.value);
    }
   
    ModNum operator*(const ModNum<MOD>& other) const {
      return ModNum(value * other.value);
    }
   
    ModNum operator/(const ModNum<MOD>& other) const {
      // 如果 MOD 不是质数,则需要使用其他方法计算逆元并进行除法运算
      // 这里仅假设 MOD 是质数的情况
      int inv = powMod(other.value, MOD-2, MOD);
      return ModNum(value * inv);
    }
   
    // 其他常用操作符重载
    bool operator==(const ModNum<MOD>& other) const {
      return value == other.value;
    }
   
    bool operator!=(const ModNum<MOD>& other) const {
      return value != other.value;
    }
   
    // 打印当前值
    void print() const {
      std::cout << value << std::endl;
    }
};

// 示例代码
using num = ModNum<1000000007>;// 使用模板生成一个取模运算类

int main() {
    num a = 10;
    num b = 7;
   
    num c = a + b;
    c.print();// 输出结果为 17
   
    num d = a * b;
    d.print();// 输出结果为 70
   
    return 0;
}

上面的代码定义了一个`ModNum`模板类,可以通过指定不同的`MOD`参数来实例化不同取模运算的类。在这个示例中,`num`被定义为`ModNum<1000000007>`,代表取模运算的模为1000000007。

你可以根据具体的需求修改这个模板类,并使用适当的模运算规则来实现你所需要的功能。

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 模运算模板