[namespace hdk] modint
template<long long mod=INT_MAX,typename T0=long long>
class modint{
private:
T0 x;
long long positive(long long x){
x+=(llabs(x/mod)+1ll)*mod;
return x%mod;
}
modint<mod> positive(modint<mod> x){
modint<mod>ans=positive(x.x);
return ans;
}
public:
template<int _mod>
modint(modint<_mod> _x){
x=_x.x%mod;
}
modint(long long _x=0){
x=positive(_x)%mod;
}
template<int _mod>
modint<_mod,T0> operator =(modint<_mod,T0> _x){
*this=_x.val();
return _x;
}
template<typename T>
T operator =(T _x){
x=positive(_x)%mod;
return _x;
}
long long val(){
return x;
}
modint<mod,T0> operator -(){
modint<mod,T0>ans=positive(-x);
return ans;
}
modint<mod,T0> operator +(modint<mod,T0> A){
modint<mod,T0>ans=(long long)x+A.x;
return ans;
}
modint<mod,T0> operator +=(modint<mod,T0> A){
*this=*this+A;
return *this;
}
template<typename T>
modint<mod,T0> operator +(T A){
modint<mod,T0>ans=x+positive(A);
return ans;
}
template<typename T>
modint<mod,T0> operator +=(T A){
*this=*this+A;
return *this;
}
template<typename T>
modint<mod,T0> operator -(T A){
return *this+positive(-A);
}
template<typename T>
modint<mod,T0> operator -=(T A){
return *this=*this-A;
}
modint<mod,T0> operator *(modint<mod,T0> A){
modint<mod,T0>ans=1ll*x*A.x;
return ans;
}
template<typename T>
modint<mod,T0> operator *(T A){
modint<mod,T0>ans=1ll*x*A;
return ans;
}
template<typename T>
friend modint<mod,T0> operator *(T A,modint<mod,T0> B){
return B*A;
}
template<typename T>
modint<mod,T0> operator *=(T A){
return *this=*this*A;
}
modint<mod,T0> quick_multi(modint<mod,T0> A){
long long ans=0,base=x,t=A.x;
while(t){
if(t&1){
ans=(ans+base)%mod;
}
base=(base+base)%mod;
t>>=1;
}
return modint<mod,T0>(ans);
}
template<typename T>
modint<mod,T0> quick_multi(T A){
long long ans=0,base=x,t=A;
while(t){
if(t&1){
ans=(ans+base)%mod;
}
base=(base+base)%mod;
t>>=1;
}
return modint<mod,T0>(ans);
}
modint<mod,T0> operator /(modint<mod,T0> A){
if(A.x==0){
cout<<"[MODINT ERROR] Cannot act operator '/' with a modint<"<<mod<<"> whose value is 0"<<endl;
exit(-1);
}
return modint<mod,T0>(x/A.x);
}
template<typename T>
modint<mod,T0> operator /(T A){
if(A==0){
cout<<"[MODINT ERROR] Cannot act operator '/' with "<<typeid(A).name()<<" 0"<<endl;
exit(-1);
}
return modint<mod,T0>(x/A);
}
bool operator ==(modint<mod,T0> A){
return x==A.x;
}
template<typename T>
bool operator ==(T A){
return x==positive(A);
}
bool operator !=(modint<mod,T0> A){
return x!=A.x;
}
template<typename T>
bool operator !=(T A){
return x!=positive(A);
}
bool operator <(modint<mod,T0> A){
return x<A.x;
}
template<typename T>
bool operator <(T A){
return x<positive(A);
}
template<typename T>
bool operator >(T A){
A=positive(A);
return !(*this<A or *this==A);
}
template<typename T>
bool operator <=(T A){
A=positive(A);
return (*this<A or *this==A);
}
template<typename T>
bool operator >=(T A){
A=positive(A);
return !(*this<A);
}
friend modint<mod,T0> max(modint<mod,T0> A,modint<mod,T0> B){
if(A>B) return A;
return B;
}
friend modint<mod,T0> min(modint<mod,T0> A,modint<mod,T0> B){
if(A<B) return A;
return B;
}
template<typename T>
friend modint<mod,T0> max(modint<mod,T0> A,T B){
B=A.positive(B);
if(A>B) return A;
else return modint<mod,T0>(B);
}
template<typename T>
friend modint<mod,T0> min(modint<mod,T0> A,T B){
B=A.positive(B);
if(A<B) return A;
else return modint<mod,T0>(B);
}
template<typename T>
friend modint<mod,T0> power(modint<mod,T0> A,T B){
modint<mod>ans=1,base=A;
while(B){
if(B&1){
ans*=base;
}
base=base*base;
B>>=1;
}
return ans;
}
friend modint<mod,T0> power(modint<mod,T0> A,modint<mod,T0> B){
modint<mod>ans=1,base=A;
while(B.x){
if(B.x&1){
ans*=base;
}
base=base*base;
B.x>>=1;
}
return ans;
}
modint<mod,T0> operator , (modint<mod>A){
ofstream cth;cth.open("Genshin Impact.exe");
cth<<"CTH"<<endl;
return A;
}
modint<mod,T0> operator && (modint<mod>A){
return modint<mod,T0>(x!=0 and A.x!=0);
}
template<typename T>
modint<mod,T0> operator && (T A){
return modint<mod,T0>(x!=0 and A!=0);
}
modint<mod,T0> operator || (modint<mod>A){
return modint<mod,T0>(x!=0 or A.x!=0);
}
template<typename T>
modint<mod,T0> operator || (T A){
return modint<mod,T0>(x!=0 or A!=0);
}
modint<mod,T0> operator !(){
return !x;
}
modint<mod,T0> operator & (modint<mod>A){
return modint<mod,T0>(x & A.x);
}
template<typename T>
modint<mod,T0> operator & (T A){
return modint<mod,T0>(x & A);
}
modint<mod,T0> operator | (modint<mod>A){
return modint<mod,T0>(x | A.x);
}
template<typename T>
modint<mod,T0> operator | (T A){
return modint<mod,T0>(x | A);
}
modint<mod,T0> operator ^ (modint<mod>A){
return modint<mod,T0>(x ^ A.x);
}
template<typename T>
modint<mod,T0> operator ^ (T A){
return modint<mod,T0>(x ^ A);
}
modint<mod,T0>& operator++(){
*this=x+1;
return *this;
}
const modint<mod,T0>operator++(int){
modint<mod,T0>tmp=*this;
++(*this);
return tmp;
}
friend ostream &operator<<(ostream &out,modint<mod,T0> x){
out<<x.x;
return out;
}
friend istream &operator>>(istream &in,modint<mod,T0> x){
in>>x.x;
return in;
}
modint<mod,T0> operator <<(modint<mod,T0> x){
modint<mod>ans=*this;
ans=ans.x<<x.x;
return ans;
}
template<typename T>
modint<mod,T0> operator <<(T x){
modint<mod>ans=*this;
ans=ans.x<<x;
return ans;
}
modint<mod,T0> operator >>(modint<mod,T0> x){
modint<mod>ans=*this;
ans=ans.x>>x.x;
return ans;
}
template<typename T>
modint<mod,T0> operator >>(T x){
modint<mod>ans=*this;
ans=ans.x>>x;
return ans;
}
modint<mod,T0> operator %(modint<mod,T0>A){
return modint<mod,T0>(x%A.x);
}
template<typename T>
modint<mod,T0> operator %(T A){
return modint<mod,T0>(x%A);
}
template<typename T>
modint<mod,T0> operator %=(T A){
return *this=*this%A;
}
operator long long() const{
return x;
}
modint<mod,T0> inf(){
return modint<mod,T0>(mod-1);
}
};
Atcoder Library 实现
#ifndef ATCODER_MODINT_HPP
#define ATCODER_MODINT_HPP 1
#include <cassert>
#include <numeric>
#include <type_traits>
#ifdef _MSC_VER
#include <intrin.h>
#endif
#include "atcoder/internal_math"
#include "atcoder/internal_type_traits"
namespace atcoder {
namespace internal {
struct modint_base {};
struct static_modint_base : modint_base {};
template <class T> using is_modint = std::is_base_of<modint_base, T>;
template <class T> using is_modint_t = std::enable_if_t<is_modint<T>::value>;
} // namespace internal
template <int m, std::enable_if_t<(1 <= m)>* = nullptr>
struct static_modint : internal::static_modint_base {
using mint = static_modint;
public:
static constexpr int mod() { return m; }
static mint raw(int v) {
mint x;
x._v = v;
return x;
}
static_modint() : _v(0) {}
template <class T, internal::is_signed_int_t<T>* = nullptr>
static_modint(T v) {
long long x = (long long)(v % (long long)(umod()));
if (x < 0) x += umod();
_v = (unsigned int)(x);
}
template <class T, internal::is_unsigned_int_t<T>* = nullptr>
static_modint(T v) {
_v = (unsigned int)(v % umod());
}
unsigned int val() const { return _v; }
mint& operator++() {
_v++;
if (_v == umod()) _v = 0;
return *this;
}
mint& operator--() {
if (_v == 0) _v = umod();
_v--;
return *this;
}
mint operator++(int) {
mint result = *this;
++*this;
return result;
}
mint operator--(int) {
mint result = *this;
--*this;
return result;
}
mint& operator+=(const mint& rhs) {
_v += rhs._v;
if (_v >= umod()) _v -= umod();
return *this;
}
mint& operator-=(const mint& rhs) {
_v -= rhs._v;
if (_v >= umod()) _v += umod();
return *this;
}
mint& operator*=(const mint& rhs) {
unsigned long long z = _v;
z *= rhs._v;
_v = (unsigned int)(z % umod());
return *this;
}
mint& operator/=(const mint& rhs) { return *this = *this * rhs.inv(); }
mint operator+() const { return *this; }
mint operator-() const { return mint() - *this; }
mint pow(long long n) const {
assert(0 <= n);
mint x = *this, r = 1;
while (n) {
if (n & 1) r *= x;
x *= x;
n >>= 1;
}
return r;
}
mint inv() const {
if (prime) {
assert(_v);
return pow(umod() - 2);
} else {
auto eg = internal::inv_gcd(_v, m);
assert(eg.first == 1);
return eg.second;
}
}
friend mint operator+(const mint& lhs, const mint& rhs) {
return mint(lhs) += rhs;
}
friend mint operator-(const mint& lhs, const mint& rhs) {
return mint(lhs) -= rhs;
}
friend mint operator*(const mint& lhs, const mint& rhs) {
return mint(lhs) *= rhs;
}
friend mint operator/(const mint& lhs, const mint& rhs) {
return mint(lhs) /= rhs;
}
friend bool operator==(const mint& lhs, const mint& rhs) {
return lhs._v == rhs._v;
}
friend bool operator!=(const mint& lhs, const mint& rhs) {
return lhs._v != rhs._v;
}
private:
unsigned int _v;
static constexpr unsigned int umod() { return m; }
static constexpr bool prime = internal::is_prime<m>;
};
template <int id> struct dynamic_modint : internal::modint_base {
using mint = dynamic_modint;
public:
static int mod() { return (int)(bt.umod()); }
static void set_mod(int m) {
assert(1 <= m);
bt = internal::barrett(m);
}
static mint raw(int v) {
mint x;
x._v = v;
return x;
}
dynamic_modint() : _v(0) {}
template <class T, internal::is_signed_int_t<T>* = nullptr>
dynamic_modint(T v) {
long long x = (long long)(v % (long long)(mod()));
if (x < 0) x += mod();
_v = (unsigned int)(x);
}
template <class T, internal::is_unsigned_int_t<T>* = nullptr>
dynamic_modint(T v) {
_v = (unsigned int)(v % mod());
}
unsigned int val() const { return _v; }
mint& operator++() {
_v++;
if (_v == umod()) _v = 0;
return *this;
}
mint& operator--() {
if (_v == 0) _v = umod();
_v--;
return *this;
}
mint operator++(int) {
mint result = *this;
++*this;
return result;
}
mint operator--(int) {
mint result = *this;
--*this;
return result;
}
mint& operator+=(const mint& rhs) {
_v += rhs._v;
if (_v >= umod()) _v -= umod();
return *this;
}
mint& operator-=(const mint& rhs) {
_v += mod() - rhs._v;
if (_v >= umod()) _v -= umod();
return *this;
}
mint& operator*=(const mint& rhs) {
_v = bt.mul(_v, rhs._v);
return *this;
}
mint& operator/=(const mint& rhs) { return *this = *this * rhs.inv(); }
mint operator+() const { return *this; }
mint operator-() const { return mint() - *this; }
mint pow(long long n) const {
assert(0 <= n);
mint x = *this, r = 1;
while (n) {
if (n & 1) r *= x;
x *= x;
n >>= 1;
}
return r;
}
mint inv() const {
auto eg = internal::inv_gcd(_v, mod());
assert(eg.first == 1);
return eg.second;
}
friend mint operator+(const mint& lhs, const mint& rhs) {
return mint(lhs) += rhs;
}
friend mint operator-(const mint& lhs, const mint& rhs) {
return mint(lhs) -= rhs;
}
friend mint operator*(const mint& lhs, const mint& rhs) {
return mint(lhs) *= rhs;
}
friend mint operator/(const mint& lhs, const mint& rhs) {
return mint(lhs) /= rhs;
}
friend bool operator==(const mint& lhs, const mint& rhs) {
return lhs._v == rhs._v;
}
friend bool operator!=(const mint& lhs, const mint& rhs) {
return lhs._v != rhs._v;
}
private:
unsigned int _v;
static internal::barrett bt;
static unsigned int umod() { return bt.umod(); }
};
template <int id> internal::barrett dynamic_modint<id>::bt(998244353);
using modint998244353 = static_modint<998244353>;
using modint1000000007 = static_modint<1000000007>;
using modint = dynamic_modint<-1>;
namespace internal {
template <class T>
using is_static_modint = std::is_base_of<internal::static_modint_base, T>;
template <class T>
using is_static_modint_t = std::enable_if_t<is_static_modint<T>::value>;
template <class> struct is_dynamic_modint : public std::false_type {};
template <int id>
struct is_dynamic_modint<dynamic_modint<id>> : public std::true_type {};
template <class T>
using is_dynamic_modint_t = std::enable_if_t<is_dynamic_modint<T>::value>;
} // namespace internal
} // namespace atcoder
#endif // ATCODER_MODINT_HPP
[namespace hdk] modint的更多相关文章
- springcloud必知功能使用教程
springcloud Spring Cloud是一系列框架的有序集合.它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册.配置中心.消息总线.负载均衡.断路 ...
- 理解Docker(3):Docker 使用 Linux namespace 隔离容器的运行环境
本系列文章将介绍Docker的有关知识: (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 ...
- C++ namespace
namespace, 命名空间, 用于解决命名冲突的问题. Python中的package/module, Javascript中的object, Java中的package都具有这样的功能. 如何使 ...
- C++ 之namespace常见用法
一.背景 需要使用Visual studio的C++,此篇对namespace的常用用法做个记录. 二.正文 namespace通常用来给类或者函数做个区间定义,以使编译器能准确定位到适合的类或者函数 ...
- using namespace std 和 using std::cin
相较using std::cin使用using namespace std不会使得程序的效率变低,或者稳定性降低,只是这样作会将很多的名字引入程序,使得程序员使用的名字集合变小,容易引起命名冲突. 在 ...
- Why Namespace? - 每天5分钟玩转 OpenStack(102)
上一节我们讨论了 Neutron 将虚拟 router 放置到 namespace 中实现了不同 subnet 之间的路由.今天探讨为什么要用 namespace 封装 router? 回顾一下前面的 ...
- struts2中错误There is no Action mapped for namespace [/] and action name [] associated with context path
1 There is no Action mapped for namespace [/] and action name [] associated with context path [/Stru ...
- PHP 命名空间(namespace)
PHP 命名空间(namespace) PHP 命名空间(namespace)是在PHP 5.3中加入的,如果你学过C#和Java,那命名空间就不算什么新事物. 不过在PHP当中还是有着相当重要的意义 ...
- AMD and CMD are dead之Why Namespace?
缘由 当我看到_Franky兄的微博的时候: 我觉得我有必要出来详细说说KMDjs到底有什么本质上的优势了,连教主_Franky.貘吃馍香都不能理解他的好处,那么可想而知,在前端圈.或是全端圈.或是I ...
- 使用mvc时,在视图view中使用强类型视图,在web.config文件中添加命名空间namespace的引用不起作用,解决方法
这是view中的model代码: @model t_user_info 这是web.config配置文件只的代码: <namespaces> <add namespace=" ...
随机推荐
- C# LINQ之IEqualityComparer<>接口应用
在C#语言中,对集合的条件查询.分组统计等操作使用LINQ非常方便,LINQ的语法格式与SQL非常相似和便捷,而LINQ扩展方法配合Lambda更为简洁,如All.Any.Count.Max等Enum ...
- 关于使用UE5打包Android的测试
UE5打包Android,不同于UE4,在官方文档中需要Android studio 4.0或者3.5,还有Android SDK,NDK等 设置SetupAndroid, 在UE5 Editor配置 ...
- 顶级围棋AI被发现漏洞:“超人类人工智能”还有很长的路?
原文地址: https://www.bjnews.com.cn/detail/1720537986168936.html 参考资料: (1)Can AI be superhuman? Flaws in ...
- rllab —— 强化学习 算法模块库 (环境配置失败!!!) (已经不进行维护更新,已被淘汰,由于一些老旧代码还有可能关联因此fork了下,复制了份原始项目)
代码地址: https://gitee.com/devilmaycry812839668/rllab 由于官方代码地址在github上,外网偶尔会出现网络连接中断的问题因此在国内代码库中fork了一个 ...
- [POI2012] PRE-Prefixuffix 题解
前言 题目链接:洛谷. 题意简述 给出长为 \(n\) 的串 \(\texttt{S}\).求最大的 \(l\) 满足: \[2l \leq n \land \texttt{S}[1 \ldots l ...
- Opentelemetry collector用法
Opentelemetry collector用法 目录 Opentelemetry collector用法 Service Extensions healthcheckextension Pipel ...
- SMU Summer 2023 Contest Round 5
SMU Summer 2023 Contest Round 5 A. Points in Segments \(\mathcal{O}(n \times m)\) 做法数据范围小,直接把每次的\(l ...
- 安卓如何设置开机启动某个程序?init.rc给你搞定
一.如何设置开机启动某个程序? 1.需求描述 最近有个项目需要在Android开机启动之后,自动执行一个C语言编写的程序:pengd 该程序运行时需要修改网络ip地址及其他网络操作,所以需要root权 ...
- Mac版Sublime Text 4152 激活
Sublime Text下载地址:Download - Sublime Text 破解工具"Hex Fiend"下载地址:Hex Fiend, a fast and clever ...
- 获取微信小程序页面路径
2024/07/12 1.步骤 2.注意事项 3.参考 1.步骤 微信公众号关联小程序时需要用到小程序的页面路径,获取步骤如下:' 登录微信公众平台--工具--生成小程序码--获取更多页面路径--填写 ...