首页 > 其他分享 >数论板子

数论板子

时间:2024-04-14 09:00:41浏览次数:20  
标签:prime phi return 数论 ll 板子 int ans

线性筛求素数

int prime[MAXN]; // 保存素数
bool is_not_prime[MAXN] = {1, 1}; // 0和1都不是素数

// 筛选 n 以内的所有素数
void xxs(int n) {
    for (int i = 2; i <= n; ++i) {
        if (!is_not_prime[i]) { // 如果i是素数
            prime[++prime[0]] = i;
        }
        for (int j = 1; j <= prime[0] && i * prime[j] <= n; ++j) {
            is_not_prime[i*prime[j]] = 1;
            // 如果i中包含了该质因子,则停止
            if (i % prime[j] == 0) break;
        }
    }
}

欧拉函数

求单个

int euler_phi(int n) {
  // 如果存在大于根号n的质因子,至多有一个
  int m = int(sqrt(n + 0.5));
  int ans = n;
  // 跟判定素数很像
  for (int i = 2; i <= m; i++) {
    // 如果i能整除n,则i是n的因子,也会质因子(看下面的while)
    if (n % i == 0) {
      ans = ans / i * (i - 1); // 根据定义计算
      // 根据唯一分解定理,去掉i的幂
      while (n % i == 0) n /= i;
    }
  }
  // 如果最后n>1,则为一个大于根号n的一个质因子
  if (n > 1) ans = ans / n * (n - 1);
  return ans;
}

求多个

// 整体框架为线性筛素数的代码,中间根据欧拉函数的性质加了几条语句而已
int n, phi[N], prime[N], tot;
bool not_prime[N]; // true表示不是素数,false表示是素数
void getPhi() {
    int i, j, k;
    phi[1] = 1;
    for (i = 2; i <= n; ++i) {
        if (!not_prime[i]) {
            prime[++tot] = i;
            phi[i] = i-1; // 根据性质2
        }
        for (j = 1; j <= tot; ++j) {
            k = i * prime[j];
            if (k > n) break;
            not_prime[k] = true;
            if (i % prime[j] == 0) { // 变形1
                phi[k] = prime[j] * phi[i];
                break;
            } else { // 变形2
                phi[k] = (prime[j]-1) * phi[i];
            }
        }
    }
}

gcd求最大公约数

// 递归形式
int gcd(int x, int y) {
    return (y == 0 ? x : gcd(y, x%y));
}

// 非递归形式
int gcd(int x, int y) {
    int r = x % y; // 取余数
    while (r) { // 余数不为0,交换变量,继续做除法
        x = y;
        y = r;
        r = x % y;
    }
    return y; // 余数为0时,除数为gcd
}

乘法逆元

费马小定理求逆元

typedef long long ll;
ll quickpow(ll a, ll n, ll p) { //快速幂求 a^n % p
    ll ans = 1;
    while(n) {
        if(n & 1) ans = ans * a % p;
        a = a * a % p;
        n >>= 1;
    }
    return ans;
}

ll niyuan(ll a, ll p) { //费马小定理求逆元 a^(p-2)%p
    return quickpow(a, p - 2, p);
}

线性求1-n逆元

// 因为 1<i<p,所以 p/i 一定小于 p
ny[1] = 1;
for (int i = 2; i < p; ++i) {
    ny[i] = (long long)(p - p / i) * ny[p % i] % p; // 注意最后的模 p 不要忘记
}

中国剩余定理

物不知数问题

LL CRT(int k, LL a[], LL r[]) {
  LL n = 1, ans = 0;
  for (int i = 1; i <= k; i++) n = n * r[i];
  for (int i = 1; i <= k; i++) {
    LL m = n / r[i], b, y;
    exgcd(m, r[i], b, y);  // b * m mod r[i] = 1
    ans = (ans + a[i] * m * b % n) % n;
  }
  return (ans % n + n) % n;
}

卢卡斯定理

求大组合数取模

// 需要先预处理出fact[],即阶乘
ll C(ll n, ll m, ll p) {
    return n < m ? 0 : fact[n] * inv(fact[m], p) % p * inv(fact[n - m], p) % p;
}

ll Lucas(ll n, ll m, ll p) {
  if (m == 0) return 1;
  return (C(n % p, m % p, p) * Lucas(n / p, m / p, p)) % p;
}

详解网址
数论基础

标签:prime,phi,return,数论,ll,板子,int,ans
From: https://www.cnblogs.com/cuichenxi/p/18133739

相关文章

  • 数学——数论/杂项
    狄利克雷卷积前置下取整的性质$\left\lfloor\frac{\lfloor\frac{a}{b}\rfloor}{c}\right\rfloor=\lfloor\frac{a}{bc}\rfloor$。证明略。上取整的性质$\left\lceil\frac{\lceil\frac{a}{b}\rceil}{c}\right\rceil=\lceil\frac{a}{bc}\rceil$证明:$\left\lceil\fr......
  • 线段树的板子题
    线段树支持单点修改,单点查询,区间修改,区间查询pushup:子节点更新父节点pushdown:把懒标记向下传build:初始化一颗树modify:修改一个区间query:查询一个区间线段树的完整代码AcWing243.一个简单的整数问题2链接:https://www.acwing.com/problem/content/244/#include<cstdio>......
  • 主席树的板子题
    题解方法1.可持久化线段树(主席树),代码有详细注释做法:先把值离散化在数值上建立线段树,维护每个数值区间中一共有多少个数问题1:如何求整体第K小数?答:二分,如果0~mid中有cnt数,cnt>=k,递归左边,如果cnt<k,递归右边,找k−cnt小的数。时间复杂的logn问题2:求【1,R】这个区间的第K......
  • 初等数论——同余
    前置模运算定义:\(a\%b(a\modb)\),表示\(a\)除以\(b\)的余数。加法:\((a+b)\%p\)。减法:\((a-b+p)\%p\)。加\(p\)是为了防止负数。乘法:\((a\timesb)\%p\)。除法无法直接运算,要用逆元(在下面会讲到)。平方运算:快速幂模运算满足:结合律,交换律,分配律。......
  • JAVA 板子
    代码片段1importjava.io.BufferedReader;importjava.io.BufferedWriter;importjava.io.IOException;importjava.io.InputStreamReader;importjava.io.OutputStreamWriter;importjava.io.PrintWriter;importjava.io.StreamTokenizer;publicclassMain{stati......
  • 基础数论
    byTheBigYellowDuck联赛前恶补知识点...欧拉函数欧拉函数\(\varphi(n)\)表示\(1\simn\)中与\(n\)互质的数的个数。欧拉函数是积性函数。特殊地,\(\varphi(1)=1\)。对于质数\(p\)显然有\(\varphi(p)=p-1\)。一些常用的结论:设\(p\)是质数,则\(\varphi(p^k)=p^k......
  • 计算系数(acwing,数论)
    题目描述:给定一个多项式 (ax+by)^k,请求出多项式展开后 x^n*y^m项的系数。输入格式:共一行,包含 5 个整数,分别为 a,b,k,n,m,每两个整数之间用一个空格隔开。输出格式:输出共 1 行,包含一个整数,表示所求的系数,这个系数可能很大,输出对 10007取模后的结果。数据范围:0≤n,m≤......
  • 蓝桥杯之初等数论
    在蓝桥杯竞赛中,初等数论部分涉及多个关键知识点。以下是对这些知识点的详细列出、基本概念解释、应用实例以及解题策略和步骤的说明:1.质数与合数基本概念:质数(素数):大于1的自然数中,只能被1和它本身整除的数。合数:除了1和它本身以外还有其他因数的自然数。应用实例:题目:......
  • Splay 板子
    普通:bool_Start;#include<bits/stdc++.h>usingnamespacestd;#defineilinline#defineTptemplate<typenameT>#defineTstemplate<typenameT,typename..._T>Tpilvoidread(T&x){ x=0;boolf=0;charc=getchar(); for(;!isdigit(c)......
  • 数论进阶
    数论基础知识常函数\[1(n)=1\]\[2(n)=2\]\[\dots\]欧拉函数\[\varphi(n)=\sum_{i=1}^n[gcd(i,n)=1]\]莫比乌斯函数\[\mu(n)=\begin{cases}1,n=1\\0,\existsd,x=d^2\\(-1)^k\(n=p_1^{c_1}p_2^{c_2}\cdotsp_k^{c_k}),otherwise\end{cases}\]黎曼函数\[\zeta(......