ACM数论模板及应用

2023-05-16

引论

      数论是算法竞赛的宠儿,几乎每个算法竞赛(不论是ACM的省赛、区域赛还是牛客网上的网络赛)都会出一道关于数论的题。这很容易理解,因为算法与数学的关系极其密切,也可以说算法拼到最后就是在拼数学,所以学好数学对于我们来说是至关重要的。下面我将给出数论的基本模板并附上相关的习题及AC代码

模板

#include<stdio.h>
#include<math.h>
#include<string.h>

typedef long long LL;

const int maxn = 10000000 + 10;
const int maxp = 700000;

int vis[maxn];     //用于在埃氏筛法中判断是否访问过
int prime[maxp];    //用于存储素数

int fac[1000005];   //存储一个整数的素因子
int cnt = 0;     //记录有多少素因子

//因数分解
void factor(int n)
{
    int a = 1;
    for(int i=2; i*i<=n; i+=a,a=2)
    {
        if(n%i==0) while(n%i==0)
        {
            fac[cnt++] = i;
            n /= i;
        }
    }
    if(n > 1) fac[cnt++] = n;
}


//素性测试,用于判断单个数字是否是素数
int is_prime(LL n)
{
    if(n <= 1) return 0;
    LL m = floor(sqrt(n) + 0.5);
    for(LL i = 2; i <= m; i++)
        if(n % i == 0) return 0;
    return 1;
}


//筛选素数
void sieve(int n)
{
    int m = (int)sqrt(n + 0.5);
    memset(vis,0,sizeof(vis));
    for(int i = 2; i <= m; i++)
        for(int j = i * i; j <= n; j += i)
            vis[j] = 1;
}


//生成素数表,放在prime数组中,返回素数个数
int gen_primes(int n)
{
    sieve(n);
    int c = 0;
    for(int i = 2; i <= n; i++) if(!vis[i])
        prime[c++] = i;
    return c;
}


//欧几里得算法(又名辗转相除法)
LL gcd(LL a, LL b)
{
    return b == 0 ? a : gcd(b, a % b);
}


//扩展欧几里得算法
void gcdEx(LL a, LL b, LL &d, LL &x, LL &y)
{
    if(!b) { d = a; x = 1; y = 0; }
    else { gcdEx(b, a % b, d, y, x); y -= x * (a / b); }
}


//模运算
LL mul_mod(LL a, LL b, LL n)
{
    return a * b % n;
}


//快速幂+模运算
LL pow_mod(LL a, LL p, LL n)
{
    if(p == 0) return 1;
    if(p == 1) return a % n;


    LL ans = pow_mod(a, p / 2, n);
    ans = ans * ans % n;
    if(p & 1) ans = ans * a % n;
    return ans;
}


//计算单个欧拉函数
int euler_phi(int n)
{
    int m = (int)sqrt(n + 0.5);
    int ans = n;
    for(int i = 2; i <= m; i++)
        if(n % i == 0){
            ans = ans / i * (i - 1);
            while(n % i == 0) n /= i;
        }
    if(n > 1) ans = ans / n * (n - 1);
    return ans;
}


//欧拉函数表
int phi[maxn];
void phi_table(int n)
{
    for(int i = 2; i <= n; i++) phi[i] = 0;
    phi[1] = 1;
    for(int i = 2; i <= n; i++)
        for(int j = i; j <= n; j += i){
            if(!phi[j]) phi[j] = j;
            phi[j] = phi[j] / i * (i - 1);
        }
}


//计算模n下a的逆
LL inv(LL a, LL n)
{
    LL d, x, y;
    gcdEx(a,n,d,x,y);
    return d == 1 ? (x + n) % n : -1;
}

应用

快速幂+模运算

hdu1061 hdu3003  hdu1163 hdu5690

欧拉函数

hdu1286   

素数

hdu2012 51nod1181 hdu2161

逆元

zoj3609

欧几里得算法及扩展欧几里得算法

uva11827 hdu2669  poj1061

 

习题代码

由于习题过多,在这里我不贴出我的代码,想看代码的同学可以参考我的github

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ACM数论模板及应用 的相关文章

  • hdu 4405 Aeroplane chess

    Problem acm hdu edu cn showproblem php pid 4405 vjudge net contest 151678 problem R Reference bbs csdn net topics 380193
  • csu 1811 Tree Intersection 2016湖南省赛 I

    Problem acm csu edu cn csuoj problemset problem pid 1811 vjudge net contest 161962 problem I Reference blog csdn net qwb
  • 字符串、字符数组的截取函数:strncpy、strsub

    字符数组的截取函数 字符串截取函数
  • 第八十七题 UVa12166 Equilibrium Mobile

    A mobile is a type of kinetic sculpture constructed to take advantage of the principle of equilibrium It consists of a n
  • HDU2085核反应堆

    Time Limit 1000 1000 MS Java Others Memory Limit 32768 32768 K Java Others Total Submission s 22891 Accepted Submission
  • 数论——欧拉函数

    在数论中 对正整数n 欧拉函数是少于或等于n的数中与n互质的数的数目 此函数以其首名研究者欧拉命名 它又称为Euler s totient function 函数 欧拉商数等 例如 8 4 因为1 3 5 7均和8互质 百度百科词条 欧拉函
  • 贪心算法之田忌赛马(超详细)

    简述 手把手教会贪心算法之田忌赛马 超详细 题目 田忌赛马 田忌和齐王赛马 两人各出n匹马 赢一场比赛得200两银子 输了赔200银子 平局不赔不赚 已知两人每匹马的速度 问田忌最多能赢多少银子 多组测试数据 每组数据的第一行是一个整数n
  • 【刷题】华为笔试面试机考 [HJ29] - 字符串加解密

    题目地址 点击跳转 题目描述 1 对输入的字符串进行加解密 并输出 2 加密方法为 当内容是英文字母时则用该英文字母的后一个字母替换 同时字母变换大小写 如字母a时则替换为B 字母Z时则替换为a 当内容是数字时则把该数字加1 如0替换1 1
  • Kattis Doors

    Problem open kattis com problems doors vjudge net contest 183886 problem B Reference 点到线段的最短距离算法 Meaning 有两个球 Alex 和 Bob
  • hdu 5818 Joint Stacks 2016 Multi-University 7

    Problem acm hdu edu cn showproblem php pid 5818 官方题解 bestcoder hdu edu cn blog 2016 multi university training contest 7
  • 二叉搜索树(树状数组)

    计数函数 程序 int lowbit int k return k k 功能 可视为每个节点的编号函数 加和函数 程序 int sum int x int ret 0 while x gt 0 ret c x x lowbit x retu
  • Buncket Sort桶排序(c++)实现代码

    代码原理我就不说了 参考 算法导论 原书第三版 p112 直接上代码会不会很爽 ConsoleApplication1 cpp 定义控制台应用程序的入口点 This programme is designed to show the Bun
  • 三种寻找最长递增(减)子序列的方法【LIS】

    最长递增 减 子序列 LIS 三种解法 问题 给定一个序列data 1 6 2 5 7 9 求出他的的最长递增子序列 容易看出为 1 2 5 7 9 长度为5 同时这种问题还有一些衍生问法如 最长非递增 减 增子序列 最长递减子序列等解法都
  • HDU1007(最近点对问题)

    题意不难理解 就是找到最近的两个点 计算其距离 除以2就是所求的圆的半径 思路很简单 运用分治的思想 先划分区间 分别找到左右区间中的最近点对 再合并区间 找到区间间的最近点对 注意如果用qsort 进行排序可能会超时 include
  • hdu 6208 The Dominator of Strings

    Problem acm hdu edu cn showproblem php pid 6208 Meaning 有 n 个字符串 问是否能找到其中一串 使得其它串都是它的子串 Analysis 如果存在这个串 那它一定是 n 个中的最长串
  • hdu 5792 World is Exploding 2016 Multi-University 5

    Problem acm hdu edu cn showproblem php pid 5792 题意 给一个序列 V 问有多少个由下标组成的四元组 a b c d 满足 a b c d a lt b c lt d Va lt Vb Vc g
  • 数的划分(递归)

    整数划分是另外的问题 题目描述 Description 将整数n分成k份 且每份不能为空 任意两种划分方案不能相同 不考虑顺序 例如 n 7 k 3 下面三种划分方案被认为是相同的 7 1 1 5 7 1 5 1 7 5 1 1 问有多少种
  • [ACM] 1016 Prime Ring Problem (深度优先搜索)

    Prime Ring Problem Problem Description A ring is compose of n circles as shown in diagram Put natural number 1 2 n into
  • Summer Holiday HDU - 1827 强连通分量+缩点

    To see a World in a Grain of Sand And a Heaven in a Wild Flower Hold Infinity in the palm of your hand And Eternity in a
  • kuangbin的模板

    直接链接 间接链接

随机推荐

  • C++中的::运算符

    原文出处 xff1a http blog csdn net libing zeng article details 54412935 一两行以上的成员函数最好被定义在类体之外 这要求一个特殊的声明语化来标识一 个函数是一个类的成员 xff1
  • C++创建类并应用

    新建一个Point h文件 在该文件中定义Point类 xff0c 代码如下 ifndef POINT H define POINT H class Point public Point void setPoint int x int y
  • UVA808(对蜂窝建立坐标系)

    这个题我是通过建立坐标系加找规律做出来的 xff0c 个人感觉难点是建立坐标系 xff0c 所以我将着重讲一下坐标系是怎么建立的 建立坐标系 xff1a 如果你有兴趣的话 xff0c 你可以将他给的图沿横线延长 xff0c 这样一个正六边形
  • Cats and Fish2017北京赛区网络同步赛

    题目链接 xff1a http hihocoder com problemset problem 1631 首先根据吃鱼的速度从小到大排序 xff0c 然后从1到x按着时间轴枚举猫的行为 xff0c 如果是吃完一条判断一下他的状态是正在吃鱼
  • leetcode729. My Calendar I

    设一个字典记录所有被预定的页面 xff0c 然后就是判断区间相交了 当发生以下两种情况之一时认为区间相交 1 起点小于左端点且终点大于左端点 2 起点大于等于左端点且起点小于右端点 代码如下 span class hljs class sp
  • 搭建java web开发环境(eclipse)

    引论 工欲善其事 xff0c 必先利其器 xff1b 想要进行web开发就必须有一款顺手的武器 xff0c eclipse作为一款知名的IDE自然是一个不错的选择 准备 eclipse依赖于JDK xff0c 所以我们在安装eclipse之
  • 安装codeblocks(win10)

    下载 进入http www codeblocks org downloads 26 xff0c 选择与你电脑对应的codeblocks版本 xff0c 这里以win10为例 xff0c 下载windows平台的codeblocks 注意要选
  • B - Palindrome-phobia(CODE FESTIVAL 2017 Final)

    题目链接 https cf17 final open contest atcoder jp tasks cf17 final b 解题思路 通过找规律发现出现的次数最多的字符与其他两个字符数量的差不能大于1 AC代码 include lt
  • poj1061青蛙的约会

    题目链接 http poj org problem id 61 1061 题目类型 扩展欧几里得算法 解题思路 设青蛙A为速度快的那只 xff0c 则有 m n t k l 61 y x 令a 61 m n b 61 l c 61 y c则
  • Android Studio中安装Kotlin插件

    http blog csdn net cto 1649900265 article details 72628878 这个链接内介绍了安装Kotlin插件的步骤 步骤 xff1a 在Android Studio中打开Settings xff
  • 骰子的游戏(牛客练习赛7)

    题目链接 https www nowcoder com acm contest 38 A 解题方法 枚举 AC代码 include lt stdio h gt const int maxn 61 10 43 5 int a maxn b m
  • C - Shopping Street(AtCoder Beginner Contest 080)

    题目链接 https beta atcoder jp contests abc080 tasks abc080 c 解题方法 因为一共只有十个时期所以我们可以枚举所有的状态 xff0c 又因为必须有1个时期开放 xff0c 所以我们从1而不
  • 经典OJ推荐

    转载自http acdream info topic tid 61 101 一 Online Judge简介 Online Judge系统 xff08 简称OJ xff09 是一个在线的判题系统 用户可以在线提交程序多种程序 xff08 如
  • 安装Tomcat(win10)

    引论 做web项目已经是一个很常见的事情了 xff0c 而我们完成后的web项目要想发布除了硬件的服务器外还需要相应的服务器软件 xff0c 而Tomcat就是一款web应用服务器 尽管因为Nginx xff08 它的性能是Apache服务
  • org.hibernate.InstantiationException: No default constructor for entity: cn.gov.entity.Book

    出错地方 xff1a org hibernate InstantiationException No default constructor for entity cn gov entity Book 出错原因 xff1a hibernat
  • 牛客练习赛8 D加边的无向图

    题目链接 https www nowcoder com acm contest 39 D 解题思路 利用并查集查找一共有几个独立的集合 xff0c 最后需要的最少边为集合个数减一 AC代码 include lt stdio h gt inc
  • 解决getHibernateTemplate().save ()不能将数据保存到数据库的问题

    原文出自http blog csdn net justerdu article details 50893583 分析 xff1a 数据是保存在缓存中而未提交到数据库中 解决办法 xff1a 在hibernate cfg xml里面加入 h
  • 输入ctrl s终端冻结怎么办

    原文出自http www xshellcn com zhishi sr ztd html 大家有没有发现每当输入ctrl s 就暂停该终端 让人着急万分 xff0c 我相信这是很多xshell的用户都会遇到的一个问题 xff0c 那应该怎么
  • java大数详解

    引论 在算法竞赛中我们经常遇到大数问题 xff0c 例如求一个很大的斐波那契数 住在这种情况下我们用常规解法 xff08 使用long long或long long int xff09 肯定是不行的 xff0c 而我们自己写一个大数的算法又
  • ACM数论模板及应用

    引论 数论是算法竞赛的宠儿 xff0c 几乎每个算法竞赛 xff08 不论是ACM的省赛 区域赛还是牛客网上的网络赛 xff09 都会出一道关于数论的题 这很容易理解 xff0c 因为算法与数学的关系极其密切 xff0c 也可以说算法拼到最