CodeForce 常用模板

目录

代码模板

#include <bits/stdc++.h>
using namespace std;
#define DEBUG 0

// #define int long long
#define fi first
#define se second
#define pb push_back
#define vt std::vector
#define lb lower_bound
#define eb emplace_back
#define sz(x) (int(x.size()))
#define all(x) x.begin(), x.end()
#define mst(x, bit) memset(x, bit, sizeof(x))
#define rep(i, l, r) for (ll i = (l); i < (r); ++ i)
#define per(i, l, r) for (ll i = (l); i >= (r); -- i)
#define dmp(x) cerr << __LINE__ << "->" << #x << " " << x << "\n"

using db = double;
using ll = long long;
using pdd = pair<db, db>;
using pll = pair<ll, ll>;
using pii = pair<int, int>;

template<typename... Args>
inline void read(Args&... args) { }
template<typename T, typename... Args>
inline void read(T &val, Args&... args) { std::cin >> val; read(args...); }

template<typename... Args>
inline void _wpr_(Args... args) { std::cout << '\n'; }
template<typename T, typename... Args>
inline void _wpr_(T val, Args... args) { std::cout << " " << val; _wpr_(args...); }
template<typename T, typename... Args>
void wpr(T val, Args... args) { std::cout << val; _wpr_(args...); }

const int mod = 1e9 + 7;
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const int maxn = 1e5 + 50;

void solve(){

}

signed main(){
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int t = 1;
    // std::cin >> t;
    while (t--) solve();
    return 0;
}

KMP

#include <bits/stdc++.h>
using namespace std;
#define show(x) for (auto &e: x) cout << e << " "; cout << '\n';

struct KMP{
    vector<int> next; // 失配时,模式串 pattern 跳转的位置
    
    void build(const string &pattern){
        int n = pattern.length();
        next.resize(n + 1); // n + 1 可以保证再完成匹配后继续跳转的方便性(也可以快速获取整个字符串的最大前缀后缀匹配)
        for (int i = 0, j = next[0] = -1; i < n; next[++i] = ++j){ // next[i + 1] = j + 1 往后推一位
            while (~j && pattern[i] != pattern[j]) j = next[j];
        }
    }
    
    vector<int> match(const string &pattern, const string &text){
        build(pattern); // 预处理 next 数组
        vector<int> res; // 代表文本串中所有匹配位置的开始 
        int n = pattern.length(), m = text.length();
        for (int i = 0, j = 0; i < m; ++ i){
            while (j > 0 && pattern[j] != text[i]) j = next[j]; // 当 j != 0 时用next数组不断尝试匹配
            if (pattern[j] == text[i]) ++ j;
            if (j == n) res.emplace_back(i - n + 1), j = next[j]; // 匹配成功,假如首位置,利用next多处理出的一位进行转移
        }
        return res;
    }
};


int main(){

    string ss = "ABABAB";
    KMP kmp;
    kmp.build(ss);
    show(kmp.next)

    return 0;
}

Prime

#include <bits/stdc++.h>
using namespace std;

namespace Prime{
    const int Prime_max = 1e6 + 50;

    int ptot; // tot prime 
    int prime[Prime_max / 10];
    int is_prime[Prime_max + 1];

    void getPrime(){
        ptot = 0;
        memset(is_prime, 0, sizeof(is_prime));
        for (int i = 2; i <= Prime_max; ++ i){
            if (!is_prime[i]) prime[ptot++] = i;
            for (int j = 0; j < ptot && prime[j] <= Prime_max / i; ++ j){
                is_prime[i * prime[j]] = 1;
                if (i % prime[j] == 0) break; // i = k*prime[j], so i * prime[j+1] = (k*prime[j+1]) * prime[j]
            }
        }
    }

    vector<pair<int, int>> Factor(long long num){
        vector<pair<int, int>> ret;
        for (int i = 0; prime[i] <= num / prime[i]; ++ i){
            pair<int, int> cur = {0, 0};
            if (num % prime[i] == 0) {
                cur.first = prime[i];
                while (num % prime[i] == 0) ++ cur.second, num /= prime[i];
                ret.push_back(cur);
            }
        }
        if (num != 1) ret.push_back(make_pair(num, 1));
        return ret;
    }


    void disp(vector<pair<int, int>> ftr){
        std::cout << "      show factor    \n";
        for (auto x: ftr)
            std::cout << "Prime: " << setw(5) << x.first << " cnt: " << setw(5) << x.second << "\n";
        std::cout << "---------------------\n";
    }
}

signed main(){
    using namespace Prime;
    getPrime();
    auto res = Factor(210);
    disp(res);
    return 0;
}

Random

#include <iostream>
#include <bits/stdc++.h>
using namespace std;

#include <random>
#include <chrono>
// 获取a,b之间均匀分布的整数
#define uid(a, b) uniform_int_distribution<int>(a, b)(rng)
// 茅台19937 
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

ST Table

#include <bits/stdc++.h>
using namespace std;

const int maxn = 1e5 + 50;
const int logn = 21;

int n; // 长度
int st[maxn][logn]; // st(i, j) -> [i, i + 2^j - 1]
int Logn[maxn], arr[maxn];

inline void pre(){
    Logn[1] = 0;
    Logn[2] = 1;
    for (int i = 3; i < maxn; ++ i) Logn[i] = Logn[i / 2] + 1;
}

void init(){
    for (int i = 0; i < n; ++ i) st[i][0] = arr[i];

    for (int j = 1; (1 << j) <= n; ++ j){
        for (int i = 0; i + (1 << j) - 1 < n; ++ i){
            st[i][j] = max(st[i][j - 1], st[i + (1 << (j - 1))][j - 1]);
        }
    }
}

int query(int l, int r){
    int s = Logn[r - l + 1];
    return max(st[l][s], st[r - (1 << s) + 1][s]);
}

INT128

#include <bits/stdc++.h>
using namespace std;


namespace I128{
#ifndef lll
    #define lll __int128
#endif
    lll read(){
        lll x = 0, f = 1;
        char ch = getchar();
        while (ch < '0' || ch > '9') { if (ch == '-') f = -1; ch = getchar(); }
        while (ch >= '0' && ch <= '9') { x = x * 10 + ch - '0'; ch = getchar(); }
        return x * f;
    }
    void print(lll x){
        if (x < 0) { putchar('-'); x = -x; }
        if (x > 9) print(x / 10);
        putchar(x % 10 + '0');
    }
}

using namespace I128;

void solve(){
    lll a = read();
    print(a);
}

int main(){
    // ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int t = 1;
    while (t--) solve();
    return 0;
}

MINT/Combine

#include <bits/stdc++.h>
using namespace std;

template<int m>
struct modint{
	unsigned int x;
	constexpr modint()noexcept:x(){}
	template<typename T>
	constexpr modint(T x_)noexcept:x((x_%=m)<0?x_+m:x_){}
	constexpr unsigned int val()const noexcept{return x;}
	constexpr modint&operator++()noexcept{if(++x==m)x=0;return*this;}
	constexpr modint&operator--()noexcept{if(x==0)x=m;--x;return*this;}
	constexpr modint operator++(int)noexcept{modint res=*this;++*this;return res;}
	constexpr modint operator--(int)noexcept{modint res=*this;--*this;return res;}
	constexpr modint&operator+=(const modint&a)noexcept{x+=a.x;if(x>=m)x-=m;return*this;}
	constexpr modint&operator-=(const modint&a)noexcept{if(x<a.x)x+=m;x-=a.x;return*this;}
	constexpr modint&operator*=(const modint&a)noexcept{x=(unsigned long long)x*a.x%m;return*this;}
	constexpr modint&operator/=(const modint&a)noexcept{return*this*=a.inv();}
	constexpr modint operator+()const noexcept{return*this;}
	constexpr modint operator-()const noexcept{return modint()-*this;}
	constexpr modint pow(long long n)const noexcept
	{
		if(n<0)return pow(-n).inv();
		modint x=*this,r=1;
		for(;n;x*=x,n>>=1)if(n&1)r*=x;
		return r;
	}
	constexpr modint inv()const noexcept
	{
		int s=x,t=m,x=1,u=0;
		while(t)
		{
			int k=s/t;
			s-=k*t;
			swap(s,t);
			x-=k*u;
			swap(x,u);
		}
		return modint(x);
	}
	friend constexpr modint operator+(const modint&a,const modint&b){return modint(a)+=b;}
	friend constexpr modint operator-(const modint&a,const modint&b){return modint(a)-=b;}
	friend constexpr modint operator*(const modint&a,const modint&b){return modint(a)*=b;}
	friend constexpr modint operator/(const modint&a,const modint&b){return modint(a)/=b;}
	friend constexpr bool operator==(const modint&a,const modint&b){return a.x==b.x;}
	friend constexpr bool operator!=(const modint&a,const modint&b){return a.x!=b.x;}
	friend ostream&operator<<(ostream&os,const modint&a){return os<<a.x;}
	friend istream&operator>>(istream&is,modint&a){long long v;is>>v;a=modint(v);return is;}
};

using mint = modint<998244353>;

namespace Combine{
	const int Combine_max = 1e5 + 50;
	mint fac[Combine_max];
	void init() { fac[0] = 1; for (int i = 1; i < Combine_max; ++ i) fac[i] = fac[i - 1] * i; }
	mint A(int n, int m) { return fac[n] / fac[n - m]; }
	mint C(int n, int m) { return fac[n] / (fac[n - m] * fac[m]); }
	mint fpow(mint x, int exp){
		mint res = 1;
		for (; exp; x *= x, exp >>= 1) if (exp & 1) res *= x;
		return res;
	}
}

signed main(){
    mint a = 1000000000;
    std::cout << a << "\n";
	using namespace Combine;
	init();
	std::cout << C(5, 3) << "\n";
    return 0;
}

DSU(不带持久化)

#include <bits/stdc++.h>
using namespace std;


struct DSU{
    vector<int> parent;
    void init(int k){
        // 0 or 1-index ?
        parent.resize(k + 1);
        for (int i = 0; i <= k; ++ i) parent[i] = i;
    }
    int find(int x){
        return parent[x] == x ? x : parent[x] = find(parent[x]);
    }
    void to_union(int x, int y){
        parent[find(x)] = find(y);
    }
    bool is_same(int x, int y){
        return find(x) == find(y);
    }
};

// 按秩合并的 不一定需要
struct DSU{
    vector<int> parent, rank;
    void init(int K){
        parent.resize(K), rank.resize(K);
        for (int i = 0; i <= K; ++ i) parent[i] = i, rank[i] = 0;
    }
    int find(int x){
        return (x == parent[x]) ? x : parent[x] = find(parent[x]);
    }
    void to_union(int to, int from){
        int rto = find(to);
        int rfrom = find(from);
        if (rto == rfrom) return;
        if (rank[rto] > rank[rfrom]) parent[rfrom] = rto;
        else {
            parent[rto] = rfrom;
            if (rank[rto] == rank[rfrom]) ++ rank[rfrom];
        }
    }
    bool is_same(int x, int y) {
        return find(x) == find(y);
    }
};
上一篇:蒙特卡洛计算亚式期权以及希腊字母计算


下一篇:codeforce 154C - Double Profiles(hash)