题目:Broot


题意:给出k,m,newx的值,求方程x^k(mod m)=newx的解,其中m为素数。


解法步骤:

(1)先暴力求m的原根g

(2)大步小步求g^t1(mod m)=newx

(3)则g^(t1+n*t2)(mod m)=newx,t2=m-1

(4)x=g^y(mod m),x^k=(g^y)^k=g^(yk)=g^(t1+n*t2)

那么就是求同于方程yk=t1(mod t2),求出y之后带入x=g^y(mod m)解出x


#include <iostream>
#include <string.h>
#include <algorithm>
#include <stdio.h>
#include <math.h>
#include <map> using namespace std;
typedef long long LL; const int N=1000005; int p[N];
bool prime[N];
int num,cnt;
LL k,m,newx,g;
LL a[65],b[65]; void isprime()
{
num=0;
int i,j;
memset(prime,true,sizeof(prime));
for(i=2;i<N;i++)
{
if(prime[i])
{
p[num++]=i;
for(j=i+i;j<N;j+=i)
{
prime[j]=false;
}
}
}
} LL multi(LL a,LL b,LL m)
{
LL ans=0;
while(b)
{
if(b&1)
{
ans=(ans+a)%m;
b--;
}
b>>=1;
a=(a+a)%m;
}
return ans;
} LL quick_mod(LL a,LL b,LL m)
{
LL ans=1;
a%=m;
while(b)
{
if(b&1)
{
ans=multi(ans,a,m);
b--;
}
b>>=1;
a=multi(a,a,m);
}
return ans;
} void factor(LL n)
{
cnt=0;
for(int i=0;(LL)p[i]*p[i]<=n;i++)
{
if(n%p[i]==0)
{
a[cnt]=p[i];
int c=0;
while(n%p[i]==0)
{
c++;
n/=p[i];
}
b[cnt++]=c;
}
}
if(n>1)
{
a[cnt]=n;
b[cnt++]=1;
}
} LL extend_Euclid(LL a,LL b,LL &x,LL &y)
{
if(b==0)
{
x=1;
y=0;
return a;
}
LL gd=extend_Euclid(b,a%b,x,y);
LL temp=x;
x=y;
y=temp-(a/b)*y;
return gd;
} LL Inv(LL n,LL p)
{
return quick_mod(n,p-2,p);
} bool dfs(int dept,LL t)
{
if(dept==cnt)
{
LL ans=quick_mod(g,t,m);
if(ans==1&&t!=m-1) return false;
return true;
}
LL tmp=1;
for(int i=0;i<=b[dept];i++)
{
if(!dfs(dept+1,t*tmp)) return false;
tmp*=a[dept];
}
return true;
} void find()
{
factor(m-1);
for(g=2;;g++)
if(dfs(0,1)) break;
} LL log_x(LL a,LL b,LL p)
{
map<LL,int>x;
LL z=(LL)ceil(sqrt(p*1.0));
LL v=Inv(quick_mod(a,z,p),p);
LL e=1;
x[1]=0;
for(int i=1;i<z;i++)
{
e=multi(e,a,p);
if(!x.count(e))
x[e]=i;
}
for(int i=0;i<z;i++)
{
if(x.count(b))
return i*z+x[b];
b=multi(b,v,p);
}
return -1;
} LL sol[1005]; void Solve(LL a,LL b,LL n)
{
LL d,x,y;
d=extend_Euclid(a,n,x,y);
if(b%d) puts("-1");
else
{
n/=d;b/=d;
sol[0]=(x*b%n+n)%n;
for(int i=1;i<d;i++)
sol[i]=sol[i-1]+n;
for(int i=0;i<d;i++)
sol[i]=quick_mod(g,sol[i],m);
sort(sol,sol+d);
for(int i=0;i<d;i++)
cout<<sol[i]<<endl;
}
} int main()
{
int t=1;
isprime();
while(cin>>k>>m>>newx)
{
find();
LL t1=log_x(g,newx,m);
LL t2=m-1;
cout<<"case"<<t++<<":"<<endl;
Solve(k,t1,t2);
}
return 0;
}

HDU3930(离散对数与原根)的更多相关文章

  1. 原根&离散对数简单总结

    原根&离散对数 1.原根 1.定义: 定义\(Ord_m(a)\)为使得\(a^d\equiv1\;(mod\;m)\)成立的最小的d(其中a和m互质) 由欧拉定理可知: \(Ord\le\P ...

  2. 不忘初心,方得始终——NOIP2016前的感悟

    不忘初心,方得始终 袛园精舍钟声响,奏诸世事本无常.沙罗双树失花色,盛者转衰如沧桑.骄者难久,恰如春宵一梦.猛者遂灭,好似风前之尘.    ——题记   人生中最令人恐惧的恐怕就是选择了,现在的你拥有 ...

  3. 数论day1 —— 基础知识(们)

    [pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=61632537 向大(hei)佬(e)势力学(di ...

  4. HDU3930 (原根)

    给定方程 X^A = B (mol C)  ,求 在[0,C) 中所有的解 , 并且C为质数. 设 rt 为 C 的原根 , 则 X = rt^x  (这里相当于求 A^x =B (mol C) 用大 ...

  5. BZOJ 3992: [SDOI2015]序列统计 [快速数论变换 生成函数 离散对数]

    3992: [SDOI2015]序列统计 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 1017  Solved: 466[Submit][Statu ...

  6. 证明与计算(2): 离散对数问题(Discrete logarithm Problem, DLP)

    离散对数问题,英文是Discrete logarithm Problem,有时候简写为Discrete log,该问题是十几个开放数学问题(Open Problems in Mathematics, ...

  7. BZOJ.3992.[SDOI2015]序列统计(DP NTT 原根)

    题目链接 \(Description\) 给定\(n,m,x\)和集合\(S\).求\(\prod_{i=1}^na_i\equiv x\ (mod\ m)\)的方案数.其中\(a_i\in S\). ...

  8. 【数论】【原根】【动态规划】【bitset】2017四川省赛 K.2017 Revenge

    题意: 给你n(不超过200w)个数,和一个数r,问你有多少种方案,使得你取出某个子集,能够让它们的乘积 mod 2017等于r. 2017有5这个原根,可以使用离散对数(指标)的思想把乘法转化成加法 ...

  9. UOJ #86 mx的组合数 (数位DP+NTT+原根优化)

    题目传送门 matthew99神犇的题解讲得非常清楚明白,跪烂Orzzzzzzzzzzzzz 总结一下,本题有很多重要的突破口 1.Lucas定理 看到n,m特别大但模数特别小时,容易想到$lucas ...

随机推荐

  1. Linux下javaweb

    Linux下javaweb环境搭建 步骤: 1.使用远程工具连接上服务器,例如xsheel(ssh).filezilla(ftp) 2.JDK安装及相关配置 3.Mysql安装及相关配置 4.Tomc ...

  2. javascript中类的属性研究

    原文:javascript中类的属性研究 本篇文章主要针对javascript的属性进行分析,由于javascript是一种基于对象的语言,本身没有类的概念,所以对于javascript的类的定义有很 ...

  3. Fileupload-1.2.1使用简单样例

    在測试本例至少须要在web程序的WEB-INF/lib下包括commons-fileupload- 1.2.1和commons-io-1.3.2两个类库. fileupload.jsp <%@ ...

  4. HDU 4791 &amp; ZOJ 3726 Alice&#39;s Print Service (数学 打表)

    题目链接: HDU:http://acm.hdu.edu.cn/showproblem.php?pid=4791 ZJU:http://acm.zju.edu.cn/onlinejudge/showP ...

  5. IIS 7.5 使用URL Rewrite模块简单设置网页跳转

    原文 IIS 7.5 使用URL Rewrite模块简单设置网页跳转 我们都知道Apache可以在配置文件里方便的设置针对网页或网站的rewrite,但是最近接手了一组IIS服务器,发现这货简单的没有 ...

  6. JS模板引擎:tppl

    全球最快的JS模板引擎:tppl 废话不多说,先上测试: 亲测请访问:[在线测试地址]单次结果不一定准确,请多测几次. tppl 的编译渲染速度是著名的 jQuery 作者 John Resig 开发 ...

  7. VS2015安装

    VS2015安装 Secondary Installer Setup Failed求解决方案 看到微软最近的一系列变化,着实让我等兴奋不已.VS2015下载地址就不说了.先来记录一下微软的几个变化吧. ...

  8. NCache实现Oracle数据与分布式缓存数据同步的3个步骤

    多层次结构的应用程序是目前发展的趋势,这种程序都需要庞大的数据库支持.而数据传输的能力直接影响程序性能,成为程序可扩展性的瓶颈.因此很多开发者开始在程序中使用内存分布式缓存来提高程序性能. 同时,内存 ...

  9. 1951: [Sdoi2010]古文字猪

    1951: [Sdoi2010]古代猪文 链接:Click Here~ 题目: 一道非常好的组合数学题.!!.题目非常长.只是就以下几段话实用. iPig认为仅仅要符合文献,每一种能整除N的k都是有可 ...

  10. 我的Android 4 学习系列之开始入手:配置开发环境与理解Hello World!

    目录 如何安装Android SDK.创建开发环境和调试项目 移动设计中一些注意事项 使用Android虚拟设备.模拟器和其他开发工具 如何安装Android SDK.创建开发环境和调试项目 下载和安 ...