题目描述

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 \sqrt{n} \rceil,x=bm+r\),我们预处理出\(y^i(i\in[0,P-1])\),用map或hash储存起来

我们从小到大枚举b,就可以根据\(y^{(b+1)m} \cdot n^{-1} \equiv y^{m-r}\pmod{P}\),在有序表中找到\(y^{m-r}\)来的到指数r

N次剩余

求关于x的同余方程\(x^y \equiv n \pmod{P}(P为质数)\)的解

设P的原根为g,因为\(\varphi(P)=P-1\),根据原根的性质\(\{1,2,3...P-1\}\)一一与\(\{g^1,g^2,g^3...g^{P-1}\}\)对应

令\(x=g^s,n=g^t\)

通过BSGS,我们可以求出t,

于是\(s \cdot y \equiv t \pmod{P-1}\),用扩展欧几里得解方程。

#include <cmath>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <queue>
#include <map>
#include <bitset>
#include <set>
#include <vector>
const int inf=2147483647;
const int mo=1e6+7;
const int N=100005;
using namespace std;
struct arr{
long long x,id;
bool operator<(const arr &b)const{
if (x == b.x) return id < b.id;
return x<b.x;
}
}E[100500];
int T;
long long sol[N],P,A,B,G,m,num,ans[N],d[N];
long long ksm(long long x,long long y)
{
long long s=1;
for(;y;y>>=1,x=x*x%P)
if(y&1) s=s*x%P;
return s;
}
bool check(int G)
{
int tmp=P-1;
for(int i=2;i*i<=tmp;i++)
{
if(tmp%i) continue;
if(ksm(G,i)==1 || ksm(G,tmp/i)==1) return false;
}
return true;
}
void pre()
{
for(G=2;!check(G);G++);
m=ceil(sqrt(P));
long long v=1;
for(int i=0;i<=m;i++)
{
arr tmp;
tmp.x=v,tmp.id=i;
E[i]=tmp;
v=v*G%P;
}
sort(E,E+m);
}
long long BSGS(long long y)
{
long long ny=ksm(y,P-2),sum=1,s=ksm(G,m);
for(int i=0;i<m;i++)
{
long long val=(sum=sum*s%P)*ny%P;
arr tmp;
tmp.x=val,tmp.id=-1;
long long pos=lower_bound(E,E+m+1,tmp)-E;
if(E[pos].x==val) return i*m+m-E[pos].id;
}
return 0;
}
int exgcd(int a,int b,int &x,int &y)
{
if(!b)
{
x=1,y=0;
return a;
}
long long r=exgcd(b,a%b,y,x);
y-=x*(a/b);
return r;
}
void residue(long long a,long long b,long long m)
{
int x=0,y=0,d=exgcd(a,m,x,y);
if(b%d) return;
num=d;
sol[0]=x*(b/d)%m;
for(int i=1;i<d;i++) sol[i]=(sol[i-1]+m/d)%m;
for(int i=0;i<d;i++) sol[i]=(sol[i]+m)%m;
}
void solve()
{
pre();
num=0,residue(A,BSGS(B),P-1);
if(!num) printf("No Solution\n");
else
{
for(int i=0;i<num;i++) ans[i]=ksm(G,sol[i]);
sort(ans,ans+num);
for(int i=0;i<num;i++) printf("%lld ",ans[i]);
putchar('\n');
}
}
int main()
{
for(scanf("%d",&T);T--;)
{
scanf("%lld%lld%lld",&P,&A,&B);
solve();
}
}

【51nod 1038】X^A Mod P的更多相关文章

  1. 【51Nod 1769】Clarke and math2

    [51Nod 1769]Clarke and math2 题面 51Nod 题解 对于一个数论函数\(f\),\(\sum_{d|n}f(d)=(f\times 1)(n)\). 其实题目就是要求\( ...

  2. 【51NOD 1847】奇怪的数学题(莫比乌斯反演,杜教筛,min_25筛,第二类斯特林数)

    [51NOD 1847]奇怪的数学题(莫比乌斯反演,杜教筛,min_25筛,第二类斯特林数) 题面 51NOD \[\sum_{i=1}^n\sum_{j=1}^nsgcd(i,j)^k\] 其中\( ...

  3. 【BZOJ 1038】[ZJOI2008]瞭望塔

    [题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1038 [题意] [题解] 可以看到所有村子的瞭望塔所在的位置只会是在相邻两个村子所代表 ...

  4. 【BZOJ 1038】 1038: [ZJOI2008]瞭望塔

    1038: [ZJOI2008]瞭望塔 Description 致力于建设全国示范和谐小村庄的H村村长dadzhi,决定在村中建立一个瞭望塔,以此加强村中的治安.我们将H村抽象为一维的轮廓.如下图所示 ...

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

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1038 X^A mod P = B,其中P为质数.给出P和A B,求< ...

  6. 【51nod 1251】 Fox序列的数量(以及带限制插板法讲解)

    为什么网上没有篇详细的题解[雾 可能各位聚聚觉得这道题太简单了吧 /kk 题意 首先题目是求满足条件的序列个数,条件为:出现次数最多的数仅有一个 分析 感谢 刚睡醒的 JZ姐姐在咱写题解忽然陷入自闭的 ...

  7. 【51nod 1355】 斐波那契数的最小公倍数

    题目 51nod的数学题都还不错啊 首先直接算显然是没有办法算的,因为\(fib\)的lcm这个东西还是太鬼畜了 我们考虑到\(fib\)数列的一个非常好的性质是\(gcd(fib_i,fib_{j} ...

  8. 【51Nod 1244】莫比乌斯函数之和

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1244 模板题... 杜教筛和基于质因子分解的筛法都写了一下模板. 杜教筛 ...

  9. 【51Nod 1501】【算法马拉松 19D】石头剪刀布威力加强版

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1501 dp求出环状不连续的前缀和,剩下东西都可以算出来,比较繁琐. 时间 ...

随机推荐

  1. ARM 版本 瀚高 数据库的启动命令

    1. 在瀚高安装目录下面执行路径 安装目录为: /opt/HighGoDB-4.3.4.3/ bin下./pg_ctl restart -D ../data 本次的密码是: highgo123   2 ...

  2. Jenkins+SVN持续环境搭建

    需要三台不同环境的服务器,SVN.Jenkins.Tomcat 1.SVN搭建 1.Subversion服务器(SVN服务器) 2.项目对应的版本库 3.版本库中钩子程序(用于触发构建命令) 在我以前 ...

  3. day03-04

    光驱 历史的东西 远程管理卡 ​ 它的作用是通过网络远程(异地)开关服务器,并可以查看服务器开关的过程等信息,早期(2010年以前),服务器托管在IDC机房,出问题,还得跑机房或者请机房的人管理,有了 ...

  4. STL-set 容器以及迭代器的简单理解

    先说下set的基本操作和时间复杂度 begin()     ,返回set容器的第一个元素 end() ,返回set容器的最后一个元素 clear()        ,删除set容器中的所有的元素 em ...

  5. 解决maven依赖包下载慢的问题

    修改maven 目录下setting.xml配置文件 在mirrors中添加如下配置即可 <mirror> <id>alimaven</id> <name&g ...

  6. 执行sql语句,不依靠实体 获取string值

     IList<string> list2 = Session.CreateSQLQuery(sql.ToString()).List<string>();

  7. c++ 性能优化策略

    c++ 性能优化策略 作者:D_Guco 来源:CSDN 原文:https://blog.csdn.net/D_Guco/article/details/75729259 1 关于继承:不可否认良好的 ...

  8. nodes.js详细安装

    nodes.js详细安装 Node.js 本章节我们将向大家介绍在window和Linux上安装Node.js的方法. 本安装教程以Node.js v4.4.3 LTS(长期支持版本)版本为例. No ...

  9. Fox新闻报道,帮助北朝鲜使用加密货币专家被捕

    根据司法部的刑事诉讼,一名美国加密货币专家周四在洛杉矶被捕,原因是涉嫌帮助朝鲜使用加密货币逃避美国的制裁.网民都说敢帮助敌人,就应该关起来.  ​​​

  10. Linux JDK升级

    一.jdk1.4卸载 Redhat Enterprise 5 中自带安装了jdk1.4,在安装jdk1.6前,把jdk1.4卸载: 1. 首先查看系统自带的JDK版本: [root@linux ~]# ...