N次剩余(详解+例题+代码)

从《国际大学生程序设计大赛算法与实现》中所学
任务:
给定N, a, p, 求出(x^N)%p=a 在模p意义下的所有解x。
说明:
令g为p的原根,因为p为素数,所以phi(p)=p-1。
由原根的性质得:
如果g为p的原根,则:g^i mod p != g^j mod p (p为素数), 其中i != j且i, j介於1至(p-1)之间
所以,可以设g^y=x, g^t=a,则有:
g^(y*N)%p=g^t
又由原根的性质:
g^(y*N)%p=g^t -> (y*N)%(p-1)=t (此方程可以由拓展欧几里得解)
另外g^t=a可以由离散对数求出
给定newx, k, m, 方程 (x^k)%m=newx, 求在模m意义下的所有解x。
限制:
0 <= newx, m, k <= 1.5*10^15; m是素数。
/*hdu 3930题意:给定newx, k, m, 方程 (x^k)%m=newx, 求在模m意义下的所有解x。限制:0 <= newx, m, k <= 1.5*10^15; m是素数。思路:N次剩余*/
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
#define LL __int64
#define PB push_back
LL mul(LL a,LL b,LL m){LL ret = 0;a %= m;while(b){if(b & 1) ret = (ret + a) % m;a = (a + a) % m;b >>= 1;}return ret;
}
LL a_b_MOD_c(LL a,LL b,LL m){LL ret = 1;a %= m;while(b){if(b&1) ret = mul(ret,a,m);a = mul(a,a,m);b >>= 1;}return ret;
}LL ext_gcd(LL a,LL b,LL &x,LL &y){if(b==0) { x=1, y=0; return a; }LL ret= ext_gcd(b,a%b,y,x);y-= a/b*x;return ret;
}
vector<LL> a;
bool g_test(LL g,LL p){for(LL i=0;i<a.size();++i)if(a_b_MOD_c(g,(p-1)/a[i],p)==1)return 0;return 1;
}
LL pri_root(LL p){a.clear();LL tmp=p-1;for(LL i=2;i<=tmp/i;++i)if(tmp%i==0){a.push_back(i);while(tmp%i==0)tmp/=i;}if(tmp!=1)a.push_back(tmp);LL g=1;while(true){if(g_test(g,p))return g;++g;}
}
const int HASH_MOD=9876543;
LL key[HASH_MOD], val[HASH_MOD];
int head[HASH_MOD], next[HASH_MOD];
struct Hash{int tot;void init(){memset(head, -1, sizeof(head));tot = 0;}LL insert(LL x, LL y){int k = x % HASH_MOD;key[tot] = x;val[tot] = y;next[tot] = head[k];head[k] = tot++;}LL find(LL x){int k = x % HASH_MOD;for(int i = head[k]; i != -1; i = next[i])if(key[i] == x)return val[i];return -1;}
}hs;
//求解模方程a^x=b(mod m),n为素数,无解返回-1  
//注意:要求0 < a < m; 0 <= b < m; 否则按题意自己转化。
//复杂度O(sqrt(m))
LL log_mod(LL a, LL b, LL m){hs.init();LL s = ceil(sqrt(m + 0.5));LL cur = 1;for (int i = 0; i < s; ++i){if(hs.find(cur)==-1) hs.insert(cur,i);    //记得先判重,在插入cur = cur * a % m;}LL v = a_b_MOD_c(a, (m - s - 1 + m) % m, m);for(int i = 0; i < s; ++i){LL tmp = hs.find(b);if(tmp!=-1)return s * i + tmp;b=b*v%m;}return -1;
}
/*n次剩余任务:给定N, a, p, 求出(x^N)%p=a 在模p意义下的所有解x。说明:令g为p的原根,因为p为素数,所以phi(p)=p-1。由原根的性质得:如果g为p的原根,则:g^i mod p != g^j mod p (p为素数), 其中i != j且i, j介於1至(p-1)之间所以,可以设g^y=x, g^t=a,则有:g^(y*N)%p=g^t又由原根的性质:g^(y*N)%p=g^t -> (y*N)%(p-1)=t (此方程可以由拓展欧几里得解)另外g^t=a可以由离散对数求出*/
vector<LL> residue(LL p, LL N, LL a){LL g = pri_root(p);g %= p;LL m = log_mod(g, a, p);vector<LL> ret;if(a == 0){ret.PB(0);return ret;}if(m == -1)return ret;LL A = N, B = p - 1, C = m, x, y;LL d = ext_gcd(A, B, x, y);if(C % d != 0) return ret;x = x * (C / d) % B;LL delta = B / d;for(int i = 0; i < d; ++i){x = ((x + delta) % B + B) % B;ret.PB(a_b_MOD_c(g, x, p));}sort(ret.begin(), ret.end());ret.erase(unique(ret.begin(), ret.end()), ret.end());return ret;
}
int main(){int cas = 0;LL k,m,newx;while(scanf("%I64d%I64d%I64d",&k, &m, &newx)!=EOF){vector<LL> ans;ans = residue(m,k,newx);printf("case%d:\n",++cas);if(ans.size()==0) puts("-1");for(int i = 0; i < ans.size(); ++i)printf("%I64d\n",ans[i]);}return 0;
}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/510401.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一文搞懂 SAE 日志采集架构

日志&#xff0c;对于一个程序的重要程度不言而喻。无论是作为排查问题的手段&#xff0c;记录关键节点信息&#xff0c;或者是预警&#xff0c;配置监控大盘等等&#xff0c;都扮演着至关重要的角色。是每一类&#xff0c;甚至每一个应用程序都需要记录和查看的重要内容。而在…

无需编写一行代码,实现任何方法的流量防护能力

背景 微服务的稳定性一直是开发者非常关注的话题。随着业务从单体架构向分布式架构演进以及部署方式的变化&#xff0c;服务之间的依赖关系变得越来越复杂&#xff0c;业务系统也面临着巨大的高可用挑战。疫情期间&#xff0c;大家可能都经历过以下的场景&#xff1a; 线上预…

素数筛选法(模板)

#include <stdio.h> #include <string.h> #include <math.h>#define MAX 1000000int is_prime[MAX5] {1}; //is_prime[i]是素数为1&#xff0c;不是素数为0 int prime_num[MAX]; //prime_num[i]是第i个素数int main() {int len 0;//memset(is_prime, …

使用日志上下文聚合插件使能上下文查询及 Livetail

背景 在排查业务故障时&#xff0c;用户往往需要查看业务日志文件来定位问题。然而&#xff0c;当用户在使用SLS收集业务日志时&#xff0c;同一个Logstore中往往存放着不同的日志&#xff08;例如同一台主机上不同目录下的文件&#xff0c;抑或是同一个K8S集群节点上不同容器…

Koordinator v0.7: 为任务调度领域注入新活力

Koordinator[1]继上次v0.6版本[2]发布后&#xff0c;经过 Koordinator 社区的努力&#xff0c;我们迎来了具有重大意义的 v0.7 版本。在这个版本中着重建设了机器学习、大数据场景需要的任务调度能力&#xff0c;例如 Coscheduling、ElasticQuota 和精细化的 GPU 共享调度能力。…

初学ACM之路(训练大纲)

初期: 一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. (4)递推. (5)构造法.(poj3295) (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996) 二.图算法: (1)图的深度优先遍历和广度优先遍历. (2)最短路径算法(dijkstra,bellma…

聊聊日志硬扫描,阿里 Log Scan 的设计与实践

日志 Scan 的发展与背景 大数据快速增长的需要 泛日志&#xff08;Log/Trace/Metric&#xff09;是大数据的重要组成&#xff0c;伴随着每一年业务峰值的新脉冲&#xff0c;日志数据量在快速增长。同时&#xff0c;业务数字化运营、软件可观测性等浪潮又在对日志的存储、计算…

注册配置、微服务治理、云原生网关三箭齐发,阿里云 MSE 持续升级

背景 注册中心是日常使用频率很高的微服务组件&#xff0c;通过较低的资源溢价帮助客户缩短微服务的构建周期、提升可用性&#xff1b;微服务治理实现了 0 门槛就能接入全链路灰度、无损上下线、限流降级、环境隔离、数据库治理等能力&#xff0c;轻松完成开源到稳定生产的跨越…

新零售标杆 SKG 全面拥抱 Serverless,实现敏捷交付

项目背景 SKG 公司是一家专注于高端健康产品的研发、设计与制造的企业。专注为消费者提供精致、时尚的高端产品&#xff0c;以及极致的按摩仪产品体验。 随着市场需求的迅速变化&#xff0c;SKG 的 IT 系统也逐渐面临着库存不准确、线上线下渠道无法协同、部署架构不灵活、IT…

Mobius函数计算 定义+代码模板

Mobius函数定义为&#xff0c;输入一个正整数N&#xff0c;当N1时&#xff0c;函数值为1&#xff0c;当N不为1时&#xff0c;首先在稿纸上将它分解质因数&#xff0c;若某质因数的个数大于1&#xff0c;则函数值为0&#xff0c;如N45&#xff0c;453*3*5,3出现了两次&#xff0…

不仅有0.0075元的深度冷归档,更有对下一代云存储的重新定义

前言&#xff1a;重新定义下一代云存储&#xff0c;需要继续保障稳定、安全、可靠和低成本&#xff0c;进一步演进 Serverless 能力&#xff0c;智能适配负载变化&#xff0c;提供智能数据管理能力以及全场景覆盖不断发展的新负载。 阿里云存储的创新活力&#xff0c;不仅拓展了…

一图看懂镜像

原文链接 本文为阿里云原创内容&#xff0c;未经允许不得转载。

数值方法求积分 详解+模板代码

什么是数值积分 数值积分可以用来求定积分的近似值。对于很多函数来说&#xff0c;我们是可以使用初等函数来表示出其积分的&#xff0c;对于这种函数&#xff0c;只需要求出不定积分然后代入值就能得到定积分了。 可是除此之外还有许多难求的函数和没法使用初等函数表示的函数…

用积木讲运维,这样的IT人太会了

积木的拼搭&#xff0c;是件细致工作。用不同的积木&#xff0c;进行组合变换&#xff0c;小孩子可能会用积木搭高楼、搭汽车、搭公路&#xff0c;而IT人则选择通过搭建小积木&#xff0c;讲解可观测的大乾坤。 大家所熟知的日志服务SLS不只是“日志存储”&#xff0c;更是一个…

再谈数据湖3.0:降本增效背后的创新原动力

前言&#xff1a;2022年3月 31 日&#xff0c;阿里云全球数据湖峰会上&#xff0c;阿里云从“湖管理、湖存储和湖计算“这三个方面&#xff0c;为观众带来了“数据湖 3.0” 的重磅升级方案。在时隔两百多天的云栖大会上&#xff0c;阿里云存储对数据湖的能力&#xff0c;进行了…

原码 反码 补码 详解

一. 机器数和真值 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念. 1、机器数 一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的&#xff0c;在计算机用一个数的最高位存放符号, 正数为0, 负数为1. 比如&#xff0c;十进制中的数 3 &…

谈谈 PolarDB-X 在读写分离场景的实践

在数据库使用过程中经常会遇到一些场景&#xff1a; 业务写流量一直相对比较稳定&#xff0c;但随着时间&#xff0c;数据不断增加&#xff0c;数据库的压力也会越来越大&#xff0c;写操作会影响到读请求的性能&#xff0c;做任何优化可能都达不到最终的效果&#xff1b;在应…

开源数据库 PolarDB 为什么能捕获娃哈哈的心?

一、娃哈哈的需求 娃哈哈已经使用PostgreSQL多年&#xff0c;使用了大量逻辑复制&#xff0c;且备库仅提供一些业务的只读服务。同时&#xff0c;其重要业务的数据库运行在共享SAN存储上。因此&#xff0c;它存在主备库延迟较大、逻辑复制不稳定且延迟大的痛点。 二、使用Pola…

全排列算法解析(视频+详解+代码+STL)

全排列生成算法 刚开始自学的时候搜了两三个scdn中关于讲解全排列问题的博客&#xff0c;但是我理解能力比较差还是没有完全理解 &#xff0c;后来就在网上搜索了视频才完全弄懂&#xff0c;现在把我理解的分享给你们。 学习视频&#xff1a;http://v.ku6.com/show/RP7r6vew4Qb…

数据库 PolarDB 开源之路该如何走?听听他们怎么说

阿里巴巴集团副总裁、阿里云数据库事业部负责人李飞飞出席了沙龙并致开场辞&#xff1a;PolarDB 是阿里云的明星产品&#xff0c;做出将PolarDB 开源的决策需要非常大的勇气。将最核心的数据库产品对外开源&#xff0c;且使用了最友好的协议&#xff0c;阿里云是全球头部云厂商…