ACM模板

模板

__int128

inline __int128 read() {
	__int128 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;
} 
inline void print(__int128 x){
	if(x < 0)
	{
		putchar('-');
		x = -x;
	}
	if(x > 9)
	{
		print(x / 10);
	}
	putchar(x%10+'0');
}

快读与快写(输入输出的优化)

inline int read(){ //读入优化 
	int x = 0, f = 1;
	char ch = getchar();
	while(ch > '9'||ch < '0')
	{
		if(ch == '-') f = -1;
		ch = getchar();
	}
	while(ch >= '0'&&ch <= '9')
	{
		x = (x<<1) + (x<<3) + (ch^48);//(x<<1)+(x<<3)是x*10的位运算,ch^48指ch-‘0’;
		ch = getchar();
	}
	return x*f;
}
inline void print(int x){ //输出优化 
	char num[200];
	int temp = x>0?x:-x;
	if(temp < 0) putchar('-');
	int cnt = 0;
	while(temp > 0)
	{
		num[cnt++] = temp%10+'0';
		temp /= 10;
	}
	while(cnt > 0) putchar(num[--cnt]);
}

快速幂

typedef long long ll;
ll q_pow(ll a, ll n, ll mod){
  ll res = 1;
  while(n > 0)
  {
    if(n&1) res = res * a % mod;
    a = a * a % mod;
    n >>= 1;
  }
   return res;
}

埃氏筛

int getprime(int n) {//返回值cnt为素数的个数
  int prime[N];
  bool is_prime[N];
  for(int i = 0; i <= n; i++) is_prime[i] = true;
  is_prime[0]=is_prime[1]=false;
  int cnt;
  for(int i = 2; i <= n; i++)
  {
    if(is_prime[i]) 
    { 
      prime[++cnt] = i;
      for(int j = 2*i; j <= n; j += i) is_prime[j] = false;
    }
   }
   return cnt;
}

欧拉筛(线性筛)

int prime[N];
bool is_prime[N];
void getprime(int n) {
   int cnt = 0;
   for(int i = 0; i <= n; i++) is_prime[i]=true;
   is_prime[0]=is_prime[1]=false;//1不是素数
   for(int i = 2; i <= n; i++)
  {
    if(is_prime[i]) prime[++cnt] = i;
    for(int j = 1; j<=cnt&&i*prime[j]<=n; j++)
    {
      is_prime[i*prime[j]] = false;
      if(i%prime[j] == 0) break; //关键步骤,去除埃氏筛中重复的删除操作
    }
  }
}

并查集

void makeset() {
  for(int i = 1; i <= n; i++)
      fa[i] = i;
}
int find(int x) {
   return fa[x]==x?x:fa[x]=find(fa[x]); 
}
void unionset(int a, int b) {
    int a = find(a),b = find(b);
    if(a == b) return ;
    else fa[b] = a;
}
struct UnionFind{
	std::vector<int> f, siz;
	UnionFind(int n){
		f.resize(n);
		siz.assign(n, 1);
		std::iota(f.begin(),f.end(), 0);
	} 
	int find(int x){
		while(x != f[x]){
			x = f[x] = f[f[x]];
		}
		return x;
	}
	bool same(int x, int y){
		return find(x)==find(y);
	}
	bool Union(int x, int y){
		x = find(x);
		y = find(y);
		if(x == y) return false;
		siz[x] += siz[y];
		f[y] = x;
		return true;	 
	}
	int size(int x) {
		return siz[find(x)];
	}
};

筛法求欧拉函数

struct Eulers{
    int p[N], phi[N], cnt = 0; bool vis[N];
    void get(int n) {//需要运行
        vis[1] = 1; phi[1] = 1;
        for(int i = 2; i <= n; i++) {
            if(!vis[i]) {
                p[cnt++] = i;
                phi[i] = i - 1;
            }
            for(int j = 0; p[j] <= n / i; j++) {
                vis[i * p[j]] = 1;
                if(i % p[j] == 0) {
                    phi[i * p[j]] = phi[i] * p[j];
                    break;
                }
                phi[i * p[j]] = phi[i] * (p[j] - 1);
            }
        }
    }
}eu;
posted @   倩影一梦  阅读(129)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示