求最小正整数x,A^x=1(mod M)求阶模板
整数的阶:设a和n是互素的正整数,使得a^x=1(mod n)成立的最小的正整数x称为a模n的阶
//求阶模板:A^x=1(mod M),调用GetJie(A,M)
//输入:10^10>A,M>1
//输出:无解返回-1,有解返回最小正整数x
//复杂度:O(M^(0.5))
long long gcd(long long a,long long b)
{
if(b==) return a;
return gcd(b,a%b);
} //欧拉函数:复杂度O(n^(0.5)),返回[1,n-1]中所有和n互素的数的个数和
long long phi(long long x)
{
long long sum=x;
for(long long i=;i*i<=x;i++)
{
if(x%i==)
{
sum=sum-sum/i;
while(x%i==) x/=i;
}
}
if(x!=) sum=sum-sum/x;
return sum;
} long long Mod_Mul(long long a,long long b,long long mod)
{
long long sum=;
while(b)
{
if(b&) sum=(sum+a)%mod;
b>>=;
a = (a+a)%mod;
}
return sum;
} //a^b%mod 快速幂
long long Quk_Mul(long long a,long long b,long long mod)
{
long long qsum=;
while(b)
{
if(b&) qsum=Mod_Mul(qsum,a,mod);
b>>=;
a=Mod_Mul(a, a, mod);
}
return qsum;
} long long GetJie(long long A,long long M)
{
long long d = gcd(A,M);
if(d != ) return -;
long long m=phi(M);
//然后对m进行拆分
long long prm[],prmcnt[];
int pcnt=;
memset(prmcnt,,sizeof(prmcnt));
long long tm = m;
for(long long i=;i*i<=tm;i++)
{
if(tm%i==)
{
prm[pcnt]=i;
while(tm%i==)
{
prmcnt[pcnt]++;
tm/=i;
}
pcnt++;
}
}
if(tm!=)
{
prm[pcnt]=tm;
prmcnt[pcnt]=;
pcnt++;
}
for(int i=;i<pcnt;i++)
{
for(int j=;j<prmcnt[i];j++)
{
if( Quk_Mul(A, m/prm[i], M)== )
{
m/=prm[i];
}
}
}
return m;
}
//再加一个打素数表的。理论上会快10倍。
//求阶模板:A^x=1(mod M),调用GetJie(A,M)
//输入:10^10>A,M>1
//输出:无解返回-1,有解返回最小正整数x
//复杂度:M^(0.5) long long PRIME[]; long long gcd(long long a,long long b)
{
if(b==) return a;
return gcd(b,a%b);
} //欧拉函数:复杂度O(n^(0.5)),返回[1,n-1]中所有和n互素的数的个数和
long long phi(long long x)
{
long long sum=x;
long long p = PRIME[];
for(int i=;p*p<=x;i++)
{
if( == x%p)
{
sum=sum-sum/p;
while(x%p==) x/=p;
}
p=PRIME[i+];
}
if(x!=) sum=sum-sum/x;
return sum;
} long long Mod_Mul(long long a,long long b,long long mod)
{
long long sum=;
while(b)
{
if(b&) sum=(sum+a)%mod;
b>>=;
a = (a+a)%mod;
}
return sum;
} //a^b%mod 快速幂
long long Quk_Mul(long long a,long long b,long long mod)
{
long long qsum=;
while(b)
{
if(b&) qsum=Mod_Mul(qsum,a,mod);//mod不是很大的时候这一步可以去掉
b>>=;
a=Mod_Mul(a, a, mod);//
}
return qsum;
} long long GetJie(long long A,long long M)
{
long long d = gcd(A,M);
if(d != ) return -;
long long m=phi(M);
//然后对m进行拆分
long long prm[],prmcnt[];
int pcnt=;
memset(prmcnt,,sizeof(prmcnt));
long long tm = m;
long long p=PRIME[];
for(long long i=;p*p<=tm;i++)
{
if(tm%p==)
{
prm[pcnt]=p;
while(tm%p==)
{
prmcnt[pcnt]++;
tm/=p;
}
pcnt++;
}
p=PRIME[i+];
}
if(tm!=)
{
prm[pcnt]=tm;
prmcnt[pcnt]=;
pcnt++;
}
for(int i=;i<pcnt;i++)
{
for(int j=;j<prmcnt[i];j++)
{
if( Quk_Mul(A, m/prm[i], M)== )
{
m/=prm[i];
}
}
}
return m;
} void getprime(long long up)
{
bool pmark[];
memset(pmark,,sizeof(pmark));
int pcnt=;
PRIME[pcnt++]=;
for(int i=;i<=up;i+=) pmark[i]=;
for(int i=;i<=up;i+=)
{
if(pmark[i]==)
{
PRIME[ pcnt++ ] = i;
for(int j=i+i;j<=up;j+=i)
{
pmark[j]=;
}
}
}
}
求最小正整数x,A^x=1(mod M)求阶模板的更多相关文章
- hiho 第116周,最大流最小割定理,求最小割集S,T
小Hi:在上一周的Hiho一下中我们初步讲解了网络流的概念以及常规解法,小Ho你还记得内容么? 小Ho:我记得!网络流就是给定了一张图G=(V,E),以及源点s和汇点t.每一条边e(u,v)具有容量c ...
- Assignment HDU - 2853(求最小改变边数)
Assignment Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- [hdu5251]矩形面积 旋转卡壳求最小矩形覆盖
旋转卡壳求最小矩形覆盖的模板题. 因为最小矩形必定与凸包的一条边平行,则枚举凸包的边,通过旋转卡壳的思想去找到其他3个点,构成矩形,求出最小面积即可. #include<cstdio> # ...
- SQL Server 2008 R2——查找最小nIndex,nIndex存在而nIndex+1不存在 求最小连续数组中的最大值
=================================版权声明================================= 版权声明:原创文章 谢绝转载 请通过右侧公告中的“联系邮 ...
- 找出数组中从未出现的最小正整数java实现
/** * 找出未出现的最小正整数 * @param A * @param n * @date 2016-10-7 * @author shaobn */ public static int find ...
- poj 3469 Dual Core CPU【求最小割容量】
Dual Core CPU Time Limit: 15000MS Memory Limit: 131072K Total Submissions: 21453 Accepted: 9297 ...
- BZOJ_1001_狼抓兔子_(平面图求最小割+对偶图求最短路)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1001 1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec ...
- The Minimum Length - HUST 1010(求最小循环节)
题意:有个一字符串A(本身不是循环串),然后经过很多次自增变成AAAAA,然后呢从自增串里面切出来一部分串B,用这个串B求出来A的长度. 分析:其实就是求最小循环节.......串的长度 - 最大 ...
- [KMP求最小循环节][HDU1358][Period]
题意 求所有循环次数大于1的前缀 的最大循环次数和前缀位置 解法 直接用KMP求最小循环节 当满足i%(i-next[i])&&next[i]!=0 前缀循环次数大于1 最小循环节是i ...
随机推荐
- vim 注释取消注释多行
按下ctrl+v选中多行,按大写I(必须是大写的I)进入编辑模式,输入注释符号如#,最后按下esc退出就完成了 取消注释一样按下ctrl+v选中,按d删除
- github 丢失的本地提交
open git bash git reflog git reset xxxxxxx
- [转载]Process工具类,提供设置timeout功能
FROM:http://segmentfault.com/blog/lidonghao/1190000000372535 在前一篇博文中,简单介绍了如何使用Process类来调用命令行的功能,那样使用 ...
- 利用excel去除txt文本中重复项
2017-04-10 1.要去重的文件,点击右键,选择程序. 2.选择excel表格或者wps表格. 3.excel表格去重:选中单元格——数据——筛选——高级筛选——选择不重复记录——确定 wps表 ...
- javascript 中event是全局变量
The only thing I can think of is that event is in fact window.event and it makes itself available wh ...
- [PWA] Add Push Notifications to a PWA with React in Chrome and on Android
On Android and in Chrome (but not on iOS), it's possible to send push notifications with a PWA. We'l ...
- iOS 设置导航栏 返回按钮文字隐藏
//隐藏返回按钮文字 [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -60) f ...
- asp.net core mvc视频A:笔记3-4.母版页与部分视图
新建项目3.4, 新建一个共享文件,一般存放在Shared目录下方 选择 如果安装了Reshaper插件可以这样添加(插件在本人博客中找) 代码 创建一个空的控制器TestController 使用布 ...
- 关于Linux网络配置
Linux网络配置 一:什么是网络接口卡以及如何查看网络接口的网络信息:在Linux系统中,主机的网络接口卡通常称为“网络接口”,我们可以使用ifconfig命令来查看网络 接口的信息(普通用户使用/ ...
- mysql中把字符串转成时间戳进行对比
::") ");