整理的算法模板合集: ACM模板

点我看算法全家桶系列!!!

实际上是一个全新的精炼模板整合计划


以下内容摘自 我的博客:算法竞赛中的数论问题 - 数论全家桶(信奥 / 数竞 / ACM)作者孟繁宇四万字十三万字符竞赛数论完全总结,将会择机发布,敬请期待 ~

题目大意:

解高次同余方程:xa≡b(modp)x^a\equiv b\ (\mod p)xa≡b (modp),其中 PPP 为质数。给出 PPP 和ABA BAB,求小于 PPP 的所有 XXX。所有数据中,解的数量不超过p\sqrt{p}p​。

  • 解高次同余方程的步骤
  1. 先求出 ppp 的一个原根 ggg 。
  2. 求出以 ggg 为底的 bbb 关于模 ppp 的指数 rrr ,即 gr≡b(modp)g^r \equiv b\ (\mod p)gr≡b (modp),即离散对数,前面讲解了如何求离散对数,直接使用BSGS求解即可。
  3. 令 x≡gy(modp)x\equiv g^y\ (\mod p)x≡gy (modp),带回原式就是求 gay≡gr(modp)g^{ay} \equiv g^r\ (\mod p)gay≡gr (modp)。(因为 111 ~ ppp 的数都可以表示为原根 ggg 的次幂模 ppp 的形式)
  4. 那么根据阶的 性质61.1.3 我们知道:ay≡r(modordpg)ay\equiv r\ (\mod ord_p\ g)ay≡r (modordp​ g),即为一个一次同余方程,我们可以直接使用 exgcd 来求解。
  5. 在000 ~ φ(p)−1\varphi(p)-1φ(p)−1中求得 yyy 的解,带回式子 x≡gy(modp)x\equiv g^y\ (\mod p)x≡gy (modp),又是一个一次同余方程,继续exgcd求解即可。
  • 一些细节
    根据原根的性质61.2.1可得,我们求出来的答案一定是没有重复的。由于我们使用的是原根,ppp 是质数,原根一共有 φ(φ(p))\varphi(\varphi(p))φ(φ(p)) 个,仅求出通解的高次同余方程的时间复杂度为O(p)O(\sqrt{p})O(p​)。
#define int long long
const int N = 500007;
unordered_map<int, int> hsh;
int prime[N], tot, t, phi, ans[N], num, a, b, p, g, x, y;
void solve(int x) {int tmp = x;tot = 0;for (int i = 2; i * i <= x; i++) {if (tmp % i == 0) {prime[++tot] = i;while (tmp % i == 0)tmp /= i;}}if (tmp > 1)prime[++tot] = tmp;
}
int qpow(int x, int b) {int tmp = 1;while (b) {if (b & 1) tmp = tmp * x % p;b >>= 1;x = x * x % p;}return tmp;
}
int BSGS(int a, int b) {hsh.clear();int block = sqrt(p) + 1;int tmp = b;for (int i = 0; i < block; i++, tmp = tmp * a % p)hsh[tmp] = i;a = qpow(a, block);tmp = 1;for (int i = 0; i <= block; i++, tmp = tmp * a % p)if (hsh.count(tmp) && i * block - hsh[tmp] >= 0)return i * block - hsh[tmp];
}
int exgcd(int &x, int &y, int a, int b) {if (b == 0) {x = 1;y = 0;return a;}int d = exgcd(x, y, b, a % b);int z = x; x = y; y = z - (a / b) * y;return d;
}
int cnt;
signed main() {scanf("%lld", &t);while (t -- ) {scanf("%lld%lld%lld", &p, &a, &b);b %= p;phi = p - 1;solve(phi);for (int i = 1; i <= p; i++) {bool flag = false;for (int j = 1; j <= tot; j++)if (qpow(i, phi / prime[j]) == 1) {flag = true;break;}if (flag == false) {g = i;break;}}int r = BSGS(g, b);int gcd = exgcd(x, y, a, phi);if (r % gcd != 0) {puts("No Solution");continue;}x = x * r / gcd;int k = phi / gcd;x = (x % k + k) % k;num = 0;while (x < phi) ans[++num] = qpow(g, x), x += k;sort(ans + 1, ans + 1 + num);for (int i = 1; i <= num; i ++ ) printf("%lld%s", ans[i], i == num ? "\n" : " ");}return 0;
}

51nod 1038 X^A Mod P( N 次剩余)相关推荐

  1. 51Nod 1046 A^B Mod C(日常复习快速幂)

    1046 A^B Mod C 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 给出3个正整数A B C,求A^B Mod C. 例如,3 5 8,3^5 Mod 8 = ...

  2. 51nod 1046 A^B Mod C

    给出3个正整数A B C,求A^B Mod C. 例如,3 5 8,3^5 Mod 8 = 3. 收起 输入 3个正整数A B C,中间用空格分隔.(1 <= A,B,C <= 10^9) ...

  3. 51nod 1123 X^A Mod B 问题

    先放在这好了...模2的次幂那一块还有问题,待改正 #include<iostream> #include<algorithm> #include<cstdio> ...

  4. casio科学计算机算mod余数,如何计算卡西欧fx-991ES计算中的Mod b

    如何计算卡西欧fx-991ES计算中的Mod b 有谁知道如何计算卡西欧fx-991ES计算器中的Mod b. 谢谢 user1035927 asked 2019-04-21T19:15:12Z 10 ...

  5. Java - 初探贪心算法(纸币找零,背包问题)

    贪心算法 1. 什么是贪心算法? 二.贪心算法的基本思路 三.贪心算法适用的问题 四.贪心算法的实现框架 五.贪心策略的选择 六.贪心算法的几个例子 1. 纸币找零问题 2. 背包问题 1. 什么是贪 ...

  6. 进程管理---经典进程的同步问题及练习

    一.生产者–消费者问题 生产着消费者问题即多个生产者和消费者对n个缓冲区的使用. 若不考虑互斥.同步问题会导致counter计数错误. 无论生产者.消费者使用缓冲池时应保证互斥使用(互斥信号量mute ...

  7. 51nod 1421 最大MOD值(高妙的调和级数复杂度)

    有一个a数组,里面有n个整数.现在要从中找到两个数字(可以是同一个) ai,aj ,使得 ai mod aj 最大并且 ai ≥ aj. Input 单组测试数据. 第一行包含一个整数n,表示数组a的 ...

  8. 1008 N的阶乘 mod P ——51Nod(同余定理)

    基准时间限制:1 秒 空间限制:131072 KB 输入N和P(P为质数),求N! Mod P = ? (Mod 就是求模 %) 例如:n = 10, P = 11,10! = 3628800 362 ...

  9. 51nod 1421 最大MOD值

    分析:首先去重排序,然后枚举a[i]的倍数,找到最大的a[j],使得a[j]小于a[i]的倍数,用二分法找,然后更新一下最大值.枚举a[i]和倍数复杂度为O(nlogn),二分O(logn),总的为O ...

最新文章

  1. Python 依赖库
  2. python3获取当前日期_如何在python3中获取当前日期和时间? – Python3教程
  3. 模仿网易新闻客户端的滚动菜单
  4. 又反转了!IEEE发布最新声明:解除对华为系成员的限制
  5. Unity2018新功能抢鲜 | ShaderGraph实战教程之溶解效果
  6. spring boot mybatis 整合_两大热门框架 Spring 与 Mybatis 如何整合呢?
  7. python爬虫结构化_python爬虫获取小区经纬度以及结构化地址
  8. h.264保存flv文件
  9. 河南计算机对口升学题,河南省计算机对口升学专基模拟试题(四)[1]
  10. 搬运小视频为什么要修改MD5值?什么是MD5?
  11. Android端控制LED屏
  12. 下单账户与实付账户不一致_如何保护您的不一致帐户
  13. RF-SIM卡的多应用COS研究与设计
  14. 互联网 IT 精英:龙泉寺静心之旅 1
  15. python 闭包及个人理解
  16. 基础 -- 网络相关单位换算(Mbps,Kbps,MBps等)
  17. 信息技术服务标准(ITSS)
  18. or1k启动文件分析
  19. 项目四 个人所得税计算器
  20. 用VB设计控制上网时间程序Java教程

热门文章

  1. OpenCV图像处理常用手段
  2. 从零开始一起学习SLAM | 点云到网格的进化
  3. 【从蛋壳到满天飞】JS 数据结构解析和算法实现-AVL树(一)
  4. Java-001-面向对象
  5. JQuery Datatable用法
  6. 64位ubuntu安装WPS
  7. Oracle高效分页存储过程实例
  8. IT运维包括最基本的三个方面
  9. 让VB菜鸟最快写出自己的外挂.通杀所有游戏
  10. 富文本编辑_博客的后台富文本编辑和阅读计数