取模整数类

const int mod = 1e9 + 7;
struct mint{
	mint(){}
	mint(int _k){
		k = _k;
	}
	int k;
	mint & operator = (const int &_k){
		k = _k;
		return *this;
	}
	friend mint operator + (const mint &x, const mint &y){
		mint z = x.k + y.k;
		if(z.k >= mod) z.k -= mod;
		return z;
	}
	friend mint operator - (const mint &x, const mint &y){
		mint z = x.k - y.k;
		if(z.k < 0) z.k += mod;
		return z;
	}
	friend mint operator * (const mint &x, const mint &y){
		mint z = 1ll * x.k * y.k % mod;
		return z;
	}
	friend mint operator / (const mint &x, const mint &y){
		mint z = 1ll * x.k * (y ^ (mod - 2) ).k % mod;
		return z;
	}
	friend mint operator ^ (mint a, int b){
		mint res = 1;
		while(b){
			if(b & 1) res = res * a;
			a = a * a;
			b >>= 1;
		}
		return res;
	}
};

const int mod = 998244353;
int inc(int x) { return x; }
int mul(int x) { return x; }
template<class ...Args>
int inc(int x, Args... y) { return (x += inc(y...) ) >= mod ? x - mod : x; }
template<class ...Args>
int dec(int x, Args... y) { return (x -= inc(y...) ) < 0 ? x + mod : x; }
template<class ...Args>
int mul(int x, Args... y) { return 1ll * x * mul(y...) % mod; }
int qpow(int a, ll b) {
    int res = 1;
    while(b) {
        if(b & 1) res = mul(res, a);
        a = mul(a, a);
        b >>= 1;
    }
    return res;
}
namespace Comb {
	vector<int> fac, ifac, inv;
	int C(int x, int y) {
		if(y > x || y < 0) return 0;
		return mul(fac[x], ifac[x - y], ifac[y]);
	}
	void init(int N) {
		fac.resize(N + 1);
		ifac.resize(N + 1);
		inv.resize(N + 1);
		fac[1] = ifac[1] = ifac[0] = fac[0] = inv[1] = 1;
		for(int i = 2; i <= N; ++i) {
			fac[i] = mul(fac[i - 1], i);
			inv[i] = mul(mod - mod / i, inv[mod % i]);
			ifac[i] = mul(ifac[i - 1], inv[i]);
		}
	}
}
posted @ 2025-01-09 23:11  cbdsopa  阅读(28)  评论(0)    收藏  举报