首页 > 其他分享 >modulo template

modulo template

时间:2023-07-21 17:37:12浏览次数:41  
标签:return res rhs MLong constexpr template modulo MInt

#include<bits/stdc++.h> using namespace std; using i64 = long long; template<class T> constexpr T power(T a, i64 b) {     T res = 1;     for (; b; b /= 2, a *= a) {         if (b % 2) {             res *= a;         }     }     return res; }   constexpr i64 mul(i64 a, i64 b, i64 p) {     i64 res = a * b - i64(1.L * a * b / p) * p;     res %= p;     if (res < 0) {         res += p;     }     return res; } template<i64 P> struct MLong {     i64 x;     constexpr MLong() : x{} {}     constexpr MLong(i64 x) : x{norm(x % getMod())} {}         static i64 Mod;     constexpr static i64 getMod() {         if (P > 0) {             return P;         } else {             return Mod;         }     }     constexpr static void setMod(i64 Mod_) {         Mod = Mod_;     }     constexpr i64 norm(i64 x) const {         if (x < 0) {             x += getMod();         }         if (x >= getMod()) {             x -= getMod();         }         return x;     }     constexpr i64 val() const {         return x;     }     explicit constexpr operator i64() const {         return x;     }     constexpr MLong operator-() const {         MLong res;         res.x = norm(getMod() - x);         return res;     }     constexpr MLong inv() const {         assert(x != 0);         return power(*this, getMod() - 2);     }     constexpr MLong &operator*=(MLong rhs) & {         x = mul(x, rhs.x, getMod());         return *this;     }     constexpr MLong &operator+=(MLong rhs) & {         x = norm(x + rhs.x);         return *this;     }     constexpr MLong &operator-=(MLong rhs) & {         x = norm(x - rhs.x);         return *this;     }     constexpr MLong &operator/=(MLong rhs) & {         return *this *= rhs.inv();     }     friend constexpr MLong operator*(MLong lhs, MLong rhs) {         MLong res = lhs;         res *= rhs;         return res;     }     friend constexpr MLong operator+(MLong lhs, MLong rhs) {         MLong res = lhs;         res += rhs;         return res;     }     friend constexpr MLong operator-(MLong lhs, MLong rhs) {         MLong res = lhs;         res -= rhs;         return res;     }     friend constexpr MLong operator/(MLong lhs, MLong rhs) {         MLong res = lhs;         res /= rhs;         return res;     }     friend constexpr std::istream &operator>>(std::istream &is, MLong &a) {         i64 v;         is >> v;         a = MLong(v);         return is;     }     friend constexpr std::ostream &operator<<(std::ostream &os, const MLong &a) {         return os << a.val();     }     friend constexpr bool operator==(MLong lhs, MLong rhs) {         return lhs.val() == rhs.val();     }     friend constexpr bool operator!=(MLong lhs, MLong rhs) {         return lhs.val() != rhs.val();     } };   template<> i64 MLong<0LL>::Mod = i64(1E18) + 9;   template<int P> struct MInt {     int x;     constexpr MInt() : x{} {}     constexpr MInt(i64 x) : x{norm(x % getMod())} {}         static int Mod;     constexpr static int getMod() {         if (P > 0) {             return P;         } else {             return Mod;         }     }     constexpr static void setMod(int Mod_) {         Mod = Mod_;     }     constexpr int norm(int x) const {         if (x < 0) {             x += getMod();         }         if (x >= getMod()) {             x -= getMod();         }         return x;     }     constexpr int val() const {         return x;     }     explicit constexpr operator int() const {         return x;     }     constexpr MInt operator-() const {         MInt res;         res.x = norm(getMod() - x);         return res;     }     constexpr MInt inv() const {         assert(x != 0);         return power(*this, getMod() - 2);     }     constexpr MInt &operator*=(MInt rhs) & {         x = 1LL * x * rhs.x % getMod();         return *this;     }     constexpr MInt &operator+=(MInt rhs) & {         x = norm(x + rhs.x);         return *this;     }     constexpr MInt &operator-=(MInt rhs) & {         x = norm(x - rhs.x);         return *this;     }     constexpr MInt &operator/=(MInt rhs) & {         return *this *= rhs.inv();     }     friend constexpr MInt operator*(MInt lhs, MInt rhs) {         MInt res = lhs;         res *= rhs;         return res;     }     friend constexpr MInt operator+(MInt lhs, MInt rhs) {         MInt res = lhs;         res += rhs;         return res;     }     friend constexpr MInt operator-(MInt lhs, MInt rhs) {         MInt res = lhs;         res -= rhs;         return res;     }     friend constexpr MInt operator/(MInt lhs, MInt rhs) {         MInt res = lhs;         res /= rhs;         return res;     }     friend constexpr std::istream &operator>>(std::istream &is, MInt &a) {         i64 v;         is >> v;         a = MInt(v);         return is;     }     friend constexpr std::ostream &operator<<(std::ostream &os, const MInt &a) {         return os << a.val();     }     friend constexpr bool operator==(MInt lhs, MInt rhs) {         return lhs.val() == rhs.val();     }     friend constexpr bool operator!=(MInt lhs, MInt rhs) {         return lhs.val() != rhs.val();     } };   template<> int MInt<0>::Mod = 998244353;   template<int V, int P> constexpr MInt<P> CInv = MInt<P>(V).inv();   using Z = MInt<0>;   constexpr int N = 1E6;   std::vector<int> minp, primes;   void sieve(int n) {     minp.assign(n + 1, 0);     primes.clear();         for (int i = 2; i <= n; i++) {         if (minp[i] == 0) {             minp[i] = i;             primes.push_back(i);         }                 for (auto p : primes) {             if (i * p > n) {                 break;             }             minp[i * p] = p;             if (p == minp[i]) {                 break;             }         }     } }   struct Comb {     int n;     std::vector<Z> _fac;     std::vector<Z> _invfac;     std::vector<Z> _inv;         Comb() : n{0}, _fac{1}, _invfac{1}, _inv{0} {}     Comb(int n) : Comb() {         init(n);     }         void init(int m) {         m = std::min(m, Z::getMod() - 1);         if (m <= n) return;         _fac.resize(m + 1);         _invfac.resize(m + 1);         _inv.resize(m + 1);                 for (int i = n + 1; i <= m; i++) {             _fac[i] = _fac[i - 1] * i;         }         _invfac[m] = _fac[m].inv();         for (int i = m; i > n; i--) {             _invfac[i - 1] = _invfac[i] * i;             _inv[i] = _invfac[i] * _fac[i - 1];         }         n = m;     }         Z fac(int m) {         if (m > n) init(2 * m);         return _fac[m];     }     Z invfac(int m) {         if (m > n) init(2 * m);         return _invfac[m];     }     Z inv(int m) {         if (m > n) init(2 * m);         return _inv[m];     }     Z C(int n, int m) {         if (n < m || m < 0) return 0;         return fac(n) * invfac(m) * invfac(n - m);     } } comb;

标签:return,res,rhs,MLong,constexpr,template,modulo,MInt
From: https://www.cnblogs.com/yonglicp/p/17572013.html

相关文章

  • vSphere通 python vmtemplate
    vSphere通pythonvmtemplate介绍vSphere是一款由VMware开发的虚拟化平台,可用于创建和管理虚拟机。借助vSphereAPI,我们可以使用Python编写脚本来与vSphere进行交互。本文将介绍如何使用Python及其相关库来管理vSphere中的虚拟机模板。准备工作要开始使用Python与vSphere进行交......
  • RedisTemplate 泛型不同 指向的是同一个实例吗
    RedisTemplate泛型不同指向的是同一个实例吗在使用RedisTemplate时,我们经常会遇到需要指定不同数据类型的情况。比如,我们可能需要将某个对象存储到Redis中,并且需要使用不同的数据类型进行序列化和反序列化。那么,RedisTemplate在这种情况下会创建多个实例吗?本文将解答这个问......
  • ARC145F Modulo Sum of Increasing Sequences
    为数不多不用多项式科技的单位根反演题。\(A\)不降比较难搞,所以首先令\(B_i=A_i+i-1\),则\(B\)单调递增。转化为对任意的\(k\in[0,\text{MOD}-1]\),求在\([0,N+M-1]\)中选\(N\)个不同的数,总和对\(\text{MOD}\)取模为\(k\)的方案数。记\(p=\text{MOD},n=N+M\)。列出......
  • 记jdbcTemplate使用的一个坑
    1、在使用jdbcTemplate时,语句不能使用select* ,不然可能就是这样的错误:Incorrectcolumncount:expected1,actual62、如果像这样的外层嵌套,应该去掉外层select*,语句:select*from(selectmater_score.mater_noasmaterNo,city,town,mater_score.avgasavgScor......
  • jdbc-plus是一款基于JdbcTemplate增强工具包,基于JdbcTemplate已实现分页、多租户、动
    ......
  • 再见RestTemplate,Spring 6.1新特性:RestClient 了解一下!
    在最近发布的Spring6.1M2版本中,推出了一个全新的同步HTTP客户端:RestClient。用一句话来让Spring开发者认识RestClient的话:像WebClient一样具备流畅API的RestTemplate。所以,RestClient的使命就是淘汰已经有14年历史的RestTemplate。关于WebClient和RestTemplate,之前在几种服务消......
  • JdbcTemplate 方法使用
    template方法总览JdbcTemplate主要提供以下五类方法:execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句;update方法及batchUpdate方法:update方法用于执行新增、修改、删除等语句;batchUpdate方法用于执行批处理相关语句;query方法及queryForXXX方法:用于执行查询相关语句;ca......
  • 高性能RestTemplate配置
    简述RestTemplateSpring框架中的RestTemplate是访问Rest服务的客户端底层通过使用java.net包实现创建HTTP请求通过使用ClientHttpRequestFactory指定不同的HTTP请求方式,主要提供了两种实现方式​ SimpleClientHttpRequest(默认)底层使用J2SE通过的方法(java.net包提......
  • redisTemplate 工具类
    RedisTemplate工具类简介Redis是一个基于内存的高性能键值存储数据库,它支持多种数据结构,如字符串、列表、哈希、集合等。在Java开发中,我们可以使用SpringDataRedis来操作Redis数据库。RedisTemplate是SpringDataRedis提供的一个核心类,用于简化Redis的操作。RedisTemplate提......
  • Sping JdbcTemplate
    SpingJdbcTemplateJdbcTemplate概述JdbcTemplate是SpringJDBC核心包(core)中的核心类,它可以通过配置文件、注解、Java配置类等形式获取数据库的相关信息,实现了对JDBC开发过程中的驱动加载、连接的开启和关闭、SQL语句的创建与执行、异常处理、事务处理、数据类型转换等操......