51Nod1038 X^A Mod P

1038 X^A Mod P N次剩余(51nod)高次同余 离散对数 X^A mod P= B,其中P为质数。给出P和A B,求< P的所有X。 例如:P = 11,A = 3,B = 5。 3^3 Mod 11 = 5 所有数据中,解的数量不超过Sqrt(P)。 input: 3 11 3 5 13 3 1 13 2 2 output: 3 1 3 9 No Solution 解: g为p的原根,p为素数,所以phi(p)=p-1。 ... 阅读详情


题目看这里
经典的n次剩余问题,用到很多数论知识点
1.扩展gcd
2.原根
3.离散对数
4.n次剩余
说一下这个算法的流程
首先,我们的方程为 xn=a(mod m) x n = a ( m o d   m ) m为质数
那么,我们首先要找m的原根g,这里g要满足的性 质就是对于 任意i<j<m,gi≠gj(mod m) 任 意 i < j < m , g i ≠ g j ( m o d   m )
那么,任何一个 x<m x < m 都可以和一个 gx g x 对应,而且是唯一对应
我们用离散对数求出一个t使得 a=gt a = g t
把原来的方程化为 n∗y=t(mod m−1) n ∗ y = t ( m o d   m − 1 )
这个就可以用扩展gcd求解了
还是比较简洁的,就是跑得很慢,主要是离散对数

#pragma GCC optimize("O3")
#pragma G++ optimize("O3")
#include<math.h>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define LL long long 
using namespace std;
int w[50010],t=0; bool vis[100010];
inline LL pow(LL x,LL k,LL M,LL s=1){
    for(;k;x=x*x%M,k>>=1) k&1?s=s*x%M:0;
    return s;
}
inline LL exgcd(LL a,LL b,LL& x,LL& y){
    if(b){
        LL r=exgcd(b,a%b,y,x);
        y-=x*(a/b); return r;
    } else { x=1; y=0; return a; }
}
inline void init(){
    for(int i=2;i<=100000;++i){
        if(!vis[i]) w[++t]=i;
        for(int j=1,k;(k=i*w[j])<=100000;++j){
            vis[k]=1;
            if(i%w[j]==0) break;
        }
    }
}
inline int gRt(LL p){
    LL s=p-1,r[40]={0},c=0;
    for(int i=1,j;w[i]*w[i]<=s;++i)
        if(s%(j=w[i])==0) for(r[++c]=j;s%j==0;s/=j);
    if(s>1) r[++c]=s;
    for(int g=1;;){
        begin:
        for(int i=1;i<=c;++i)
            if(pow(g,(p-1)/r[i],p)==1){ ++g; goto begin; }
        return g;
    }
}
struct P{
    LL x,y;
    inline bool operator< (const P& b){
        return x==b.x?y<b.y:x<b.x; 
    }
} s[100010],a;
inline LL log(LL x,LL n,LL m){
    LL q=sqrt(m)+1,c=1,inv,r;
    for(int i=0;i<q;++i){
        s[i]=(P){c,i}; c=c*x%m;
    }
    sort(s,s+q); inv=pow(c,m-2,m); c=1;
    for(int i=0;i<q;++i){
        r=n*c%m;
        a=*lower_bound(s,s+q,(P){r,-1});
        if(a.x==r) return i*q+a.y;
        c=c*inv%m;
    }
    return -1;
}
int W[100000];
inline int Ndx(int M,int n,int a){
    if(!a) return puts("0");
    int g=gRt(M); LL m=log(g,a,M);
    if(m<0) return puts("No Solution");
    LL x,y,r=exgcd(n,--M,x,y),d;
    if(m%r) return puts("No Solution");
    x=x*(m/r)%M; d=M/r;
    for(int i=0;i<r;++i){
        x=(x+d+M)%M;
        W[i]=pow(g,x,M+1);
    }
    sort(W,W+r);
    for(int i=0;i<r;++i) printf("%d ",W[i]); puts("");
}
int main(){
    int T,N,M,A; init();
    for(scanf("%d",&T);T--;Ndx(M,N,A)) scanf("%d%d%d",&M,&N,&A);
}
二维地图常算法 多边形与多边形的关系 判断点在不在矩形里 #define geo_max(a,b) (((a) > (b)) ? (a) : (b)) #define geo_min(a,b) (((a) < (b)) ? (a) : (b)) GEO_EXPORT mappoint geo_trangeo2map(georect* grt, geopoint* pt, maprect* mrt); GEO_EXPORT geopoint geo_tranmap2geo(maprect* mrt, mappoint* mpt, georect* grt); /* *判断点在不在矩形里.在返回0 * 不在返回-1 */ GEO_EXPORT int geo_gptingrt(geopoint* gpt, georect* grt); GEO_EXPORT int geo_mptinmrt(mappoint* mpt, maprect* mrt); GEO_EXPORT geobool geo_gptingpolygon(geopoint* gpt, geopoints *gpts); /* *返回单位为:米 */ GEO_EXPORT double geo_distance(geopoint* gptfrom, geopoint* gptto); GEO_EXPORT double geo_distance_pt2polyline(geopoint* gpt, geopoints* gpts, geopoint* rnearestpt); GEO_EXPORT double geo_distance_pt2polygon(geopoint* gpt, geopoints* gpts, geopoint* rnearestpt); /* *返回单位为:平方米 */ //GEO_EXPORT double geo_area(geopoints* gpts); /* *返回单位为:度 *正北为0度,顺时针为正 */ GEO_EXPORT double geo_direction(geopoint* gptfrom, geopoint* gptto); /* * 矩形与矩形的关系 * a 在 b 里面, 返回 0 * a 部份在 b 里面,返回 1 * a 没和 b 相交, 返回 -1 * /\ y * | * | * | * |------------> x * o */ int geo_grtingrt(georect* rta, georect* rtb); /* * 矩形与矩形的关系 * a 在 b 里面, 返回 0 * a 部份在 b 里面,返回 1 * a 没和 b 相交, 返回 -1 * * o * |------------> x * | * | * | * | * \/ y */ int geo_mrtinmrt(maprect* rta, maprect* rtb); //判断线段是否相关 //相交返回GEO_TRUE //不相交返回GEO_FALSE geobool geo_linecrossline(geopoint* lafrom, geopoint* lato, geopoint* lbfrom, geopoint* lbto); /* * 多边形与多边形的关系 * a 在 b 里面, 返回 0 * a 和 b 相交,返回 1 * a 没和 b 相交, 返回 -1 * b 在 a 里面, 返回 -2 * * /\ y * | * | * | * |------------> x * o */ int geo_gpolygoningpolygon(geopoints* gptsa, geopoints* gptsb); 立即下载

相关推荐

ACM/ICPC数论报告

对将要研究ACM数论方面的同学可能有帮助 模运算的两种算法 中国剩余定理

快速幂讲解

快速幂,用于计算范围较大的阶乘

Whisper的博客 322

求树的重心

树的重心:找到一个点,其所有的子树中最大的子树节点数最少,那么这个点就是这棵树的重心,删去重心后,生成的多棵树尽可能平衡。 树的重心可以通过简单的两次搜索求出,第一遍搜索求出每个结点的子结点数量son[u],第二遍搜索找出使max{son[u],n-son[u]-1}最小的结点。 实际上这两步操作可以在一次遍历中解决。对结点u的每一个儿子v,递归的处理v,求出son[v],然后判断是否是结点数最多的子树,处理完所有子结点后,判断u是否为重心。

51nod1038 X^A Mod P 原根+BSGS

Description XAmodP=BX^A mod P = BXAmodP=B,其中PPP为质数。给出PPP和AAA BBB,求&amp;lt;P&amp;lt; P&lt;P的所有XXX。 例如:P=11,A=3,B=5P = 11,A = 3,B = 5P=11,A=3,B=5。 33Mod11=53^3 Mod 11 = 533Mod11=5 所有数据中,解的数量不超过Sqrt(P)Sq...

xgc_woker的博客 266

VSCode+Keil高效开发STM32:Keil Assistant插件配置全攻略

本文详细介绍了如何通过VSCode的Keil Assistant插件,将Keil MDK的编译调试能力与VSCode的现代编辑体验相结合,打造高效的STM32开发环境。文章涵盖了从环境配置、工程导入、智能提示设置到与STM32CubeMX协同工作的全流程攻略,旨在解决Keil编辑器效率低下的痛点,大幅提升嵌入式开发的编码与项目管理效率。

gold的博客 507

从零构建:四轴机械臂D-H参数建模与MATLAB实战指南

本文详细介绍了四轴机械臂D-H参数建模的完整流程与MATLAB实战应用。从机械臂运动学基础出发,解析D-H参数原理与坐标系建立规则,提供MATLAB Robotics Toolbox的安装、模型创建及正逆运动学求解的代码实现。特别针对四轴机械臂的逆运算优化、轨迹规划和奇异位形规避等高级应用给出实用解决方案,是机器人开发者的实战指南。

weixin_29062255的博客 419

快速幂运算

Description 给你三个整数a,b,p,求abmodp的值 Input 第一行是一个整数t,表示t组数据。 接下来的n行,每行有3个整数,分别表示a, b, p t ≤ 2 * 105,a > 0, b > 0, p ≥ 2, Output 每组数据,输出一个整数表示答案。 Sample Input 2 2 10 9 2 3 3 Sample Output 7 2 #include <iostream> using namespace s...

qq_50065237的博客 307

Yakit实战:利用验证码识别插件突破Webfuzzer自动化测试瓶颈

本文详细介绍了如何利用Yakit的Webfuzzer模块结合验证码识别插件,突破自动化安全测试中的验证码瓶颈。通过实战演示,讲解了如何部署本地OCR服务、编写热加载脚本,实现从获取验证码到自动识别并替换的全流程自动化,从而让Webfuzzer能够高效、无人值守地进行大规模密码喷洒等测试。

weixin_29323493的博客 282

__int128取代欧拉降幂

链接:https://ac.nowcoder.com/acm/contest/392/B 来源:牛客网 找到了心仪的小姐姐月月后,华华很高兴的和她聊着天。然而月月的作业很多,不能继续陪华华聊天了。华华为了尽快和月月继续聊天,就提出帮她做一部分作业。 月月的其中一项作业是:给定正整数A、B、P,求ABmodPABmodP的值。华华觉得这实在是毫无意义,所以决定写一个程序来做。但是华华并不会写程...

qq_41755258的博客 423

用STM32F103单片机控制电调制动无刷电机

用电调控制无刷电机制作遥控飞艇 蓝牙控制 调控电调 无刷电机 用电调控制无刷电机制作遥控飞艇 代码区 mian.c #include "delay.h" #include "sys.h" #include "usart.h" #include "usart3.h" #include "timer.h" #include "led.h" #include "key.h" int main(v...

子非鱼 的博客 2万+

从0到1:提示工程架构师搭建Agentic AI系统的全流程实战手册

Agentic AI(自主智能体)是具备自主决策能力的大模型应用感知(Perceive):获取外部环境信息(比如代码仓库、用户输入、数据库数据);记忆(Memory):存储和检索历史信息(比如过去的审计记录、用户偏好);规划(Plan):将复杂任务拆解为可执行的步骤(比如“代码审计”拆成3步);行动(Act):调用工具或API完成具体操作(比如调用Git克隆仓库、调用Safety查漏洞);反馈(Feedback):根据结果调整策略(比如用户说“报告不够详细”,下次增加逻辑漏洞的分析深度)。

AI Agent Harness Engineering 1039

【模板】乘法逆元

题目 洛谷P3811乘法逆元 题解 定义:乘法逆元又称数论倒数。若且a,m互质,则x为a的逆元,记为,若a,m不互质,则不存在逆元。当且仅当m为素数时,a有唯一的乘法逆元。 用途:在模算术中,有以下几个公式: (a+b) mod p =((a mod p)+(b mod p)) mod p (a-b) mod p=((a mod p) – (b mod p) + p) mod p ab mod p=(a mod p)(b mod p)mod p 在模意义下的运算..

zjgmartin的博客 570

基于STM32开发板的USB MIDI键盘实现

在本文中,我们介绍了如何使用STM32开发板和相应的软件工具来实现USB MIDI键盘。通过配置STM32CubeMX和编写相应的源代码,我们能够将STM32开发板转换为一个功能齐全的USB MIDI设备。我们将使用STM32开发板和相应的软件工具来实现这一功能,并提供相应的源代码供参考。此时,您应该可以使用STM32开发板作为USB MIDI键盘,并在按键按下时听到相应的音符。在STM32CubeMX中,选择适当的STM32型号,并启动一个新的项目。然后,将生成的可执行文件烧录到STM32开发板中。

2301_79326616的博客 1588

51nod 1038 X^A Mod P( N 次剩余)

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

繁凡さん的博客 628

【ARMv9 DSU-120 系列 1 -- DSU-120 DynamIQ 概述】

ARMv9架构中的DynamIQ™ Shared Unit-120(简称DSU-120)为一组基于Cortex-A类架构的核心提供了共享的L3内存系统、窥探控制(snoop control)和 过滤(filtering) 以及其他支持集群运作的控制逻辑。这个集群被称为DSU-120 DynamIQ™集群。此外,所有连接到片上系统(SoC)的外部接口也都是通过DSU-120提供的。一个DSU-120 DynamIQ™集群可以包含1到14个核心,且同一集群中可包含多达三种不同类型的核心。

CodingCos的博客 1185

微信小程序 - 最新详细实现 “餐厅食堂外卖点餐“ 全屏左右联动菜单列表功能界面,附带搜索框、购物车功能、商品加减计算金额、折扣等,左侧商品分类,右侧列表数据,仿美团饿了么外卖点餐页面,饭店扫码点餐!

微信小程序,vue2,vue3,左右联动菜单,商品分类页面,点餐界面,美团外卖点餐,左右布局界面,饿了么点餐页面,左分类右列表,小程序实现左侧菜单,外卖点餐联动,锚点,点击左侧大类后侧列表跟着变跟着刷新,菜单左右联动效果,左菜单右边列表数据,uniapp,左侧菜单,右侧列表双向联动效果,右侧商品滑动时,右侧列表双向联动效果,侧边菜单和右边滚动条,电商项目,购物车,商品加减计算,外卖选餐页面带购物车计算,自动计算金额,微信小程序外卖点餐界面源码,店铺页面滑动左右联动,点餐类小程序界面,堂食,扫码点餐,餐饮行业

🏆 前端领域优质创作者 5157

【51nod 1038】X^A Mod P

题目描述 X^A mod P = B,其中P为质数。给出P和A B,求< P的所有X。 例如:P = 11,A = 3,B = 5。 3^3 Mod 11 = 5 所有数据中,解的数量不超过Sqrt(P)。 分析 这道题包括几个知识点 离散对数(大步小步BSGS算法) 求关于x的同余方程\(y^x \equiv n \pmod{P}(P为质数)\)的解, 设\(m=\lceil \...

weixin_30593261的博客 104

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

51NOD 1038:X^A Mod P——题解

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1038 X^A mod P= B,其中P为质数。给出P和A B,求< P的所有X。 找了半天找到了一道模板题,死嗑了一晚上对着题解写完了。 道理应该都懂吧……不懂我也懒的再说一遍了,看其他人博客吧:https://blog.youkuaiyun.com/dream...

weixin_34290352的博客 161

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

[51nod1038]X^A Mod P

X^A mod P= B,其中P为质数。给出P和A B,求< P的所有X。 例如:P = 11,A = 3,B = 5。 3^3 Mod 11 = 5 所有数据中,解的数量不超过Sqrt(P)。 Input 第1行:一个数T,表示后面用作输入测试的数的数量。(1<=T<=100) 第2-T+1行:每行3个数PAB,中间用空格隔开。(1...

weixin_30642267的博客 96

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

51Nod-1038-X^A Mod P

ACM模版描述题解第一次接触原根这个玩意儿,感觉真恶心,一脸懵逼啊……leader_win’s blog 讲得倒是十分详细,可是我依然懵逼着,数论真的恶心,太多太多╮(╯﹏╰)╭……代码#include <cmath> #include <vector> #include <cstdio> #include <iostream> #include <algorithm>using namespace

逐梦者 575

【解高次同余方程】51nod1038 X^A Mod P

1038 X^AModP 基准时间限制:1 秒 空间限制:131072 KB 分值: 320 X^A mod P= B,其中P为质数。给出P和A B,求< P的所有X。 例如:P = 11,A = 3,B = 5。 3^3 Mod 11 = 5 所有数据中,解的数量不超过Sqrt(P)。 Input 第1行:一个数T,表示后面用作输入测试的数的...

weixin_30357231的博客 178

51Nod1038 X^A Mod P 数论 原根 BSGS

原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1038.html 题目传送门 - 51Nod1038 题意 题解   在模质数意义下,求高次剩余,模板题。 UPD(2018-09-10):   详见数论总结。   传送门 -https://www.cnblogs.com/zhouzhendong/p/Num...

weixin_30371875的博客 178

快速幂等几种幂问题

一、 51nod1046 给出3个正整数A B C,求A^B Mod C。 例如,3 5 8,3^5 Mod 8 = 3。  收起 输入 3个正整数A B C,中间用空格分隔。(1 &lt;= A,B,C &lt;= 10^9) 输出 输出计算结果 输入样例 3 5 8 输出样例 3   #include&lt;cstdio&gt; #include&lt;...

奋斗的女孩儿 396
上一篇: 51Nod2026 Gcd and Lcm
下一篇: 数学公式测试
扩展的灰
博客等级 码龄12年 60粉丝 342原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值