数论模板 满足a^x≡1(mod n)的最小正整数
来源:互联网 发布:wps数据透视表使用方法 编辑:程序博客网 时间:2024/05/17 05:12
Description
满足a^x≡1(mod n)的最小正整数x称为a模n的阶。
现给出两个正整数,求x。
Input
第一行输入k,表示有k组数据
之后k行每行两个数a,n(2<=a,n<=10^9)
Output
对于每组输入,用一行输出x的值,若不存在输出-1
Sample Input
22 32 4
Sample Output
2-1
Hint
当a与n不互质的时候,肯定不存在,否则x的最大值是x的欧拉函数,所以要从x的欧拉函数的因子中筛,考虑此题的数据范围,欧拉函数直接求,gcd用二进制,
满足a^x≡1(mod n)的最小正整数x称为a模n的阶。
现给出两个正整数,求x。
#include <iostream>#include <iomanip>#include <cstdio>#include <cstring>#include <climits>#include <cmath>using namespace std;#define SIZE 655//筛法求欧拉函数int Euler[SIZE] = {0};void sieve(){ Euler[1] = 1; for(int i=2;i<SIZE;++i){ if ( Euler[i] ) continue; for(int j=i;j<SIZE;j+=i){ if ( !Euler[j] ) Euler[j] = j; Euler[j] = Euler[j] / i * ( i - 1 ); } }}typedef int int_t;int_t gcd(int_t a,int_t b){ while( b ){ int_t r = b; b = a % b; a = r; } return a;}//快速GCDint Fastgcd(int a, int b){ if (a == 0) return b; if (b == 0) return a; if (!(a & 1) && !(b & 1)) return Fastgcd(a>>1, b>>1)<<1; else if (!(b & 1)) return Fastgcd(a, b>>1); else if (!(a & 1)) return Fastgcd(a>>1, b); else return Fastgcd(abs(a - b), min(a, b));}int euler_phi(int n){ int m = floor(sqrt(n+0.5)); int ans = n; for(int i = 2; i <= m; i++) if(n%i == 0) { ans = ans / i * (i-1); while(n%i == 0) { n /= i; } } if(n > 1) ans = ans / n *(n-1); return ans;}//计算a^b%modtypedef long long llt;llt powerMod(llt a,llt b,llt mod){ llt ret = 1LL; a %= mod; while( b ){ if ( b & 1LL ) ret = ret*a % mod,--b;//multiMod(ret,a,mod),--b; b >>= 1LL; a = a*a%mod;//multiMod(a,a,mod); } return ret;}int main(){ //sieve(); int k;scanf("%d",&k); while(k--){ int a,n; scanf("%d%d",&a,&n); if ( Fastgcd(a,n) == 1){ //printf("%d\n",Euler[n]); int tmp = euler_phi(n); int ans = INT_MAX; for (int i = 1;i*i <= tmp;++i){ if ( tmp % i ) continue; if (1 == powerMod( a,i,n) ) ans = min(ans,i); if (1 == powerMod( a,tmp/i,n)) ans = min(ans,tmp/i); } printf("%d\n",ans); } else printf("-1\n"); } return 0;}
0 0
- 数论模板 满足a^x≡1(mod n)的最小正整数
- 给定一个正整数n,要求找到最小的x(x>0)满足2^x mod n = 1。
- hdu 2815 Mod Tree 模方程a^x=b(mod n),n为任意正整数+模板题(扩展Baby Step Giant Step)
- HDU 1395 2^x mod n = 1 数论
- ZOJ 1489 2^x mod n = 1 数论
- HDU1395_2^x mod n = 1【数论】【水题】
- ACM 数论 hdu 1395 2^x mod n = 1
- 满足1+2+3+n<8888的最大正整数n
- 求 X^a mod N
- 【2016杭电女生赛1009】【挖掘本质找关系 模拟】sum 找到最小的正整数,满足a乘sum(n)==b乘S(2n)
- 关于方程a^x=1(mod m)的最小x解
- 关于方程a^x=1(mod m)的最小x解
- 求 a^b mod mod 的模板
- (step7.2.1)hdu 1395(2^x mod n = 1——简单数论)
- hdu 1395 2^x mod n = 1 (简单数论)
- hdu1395 2^x mod n = 1(数论:快速幂取模+欧拉定理)
- 数论 杭电 1395 2^x mod n = 1 暴力题
- HDU1395 ZOJ1489 2^x mod n = 1【暴力法+数论】
- 链式存储结构即链式结构简单介绍
- BZOJ2160 拉拉队排练
- continue与break的区别
- Spring在代码中获取bean的几种方式
- iOS值打包上线AppStore发的邮件
- 数论模板 满足a^x≡1(mod n)的最小正整数
- 【2016-08-15】{Spring数据源}
- 动态规划之石子合并
- C语言结构体 共用体0815
- 数据库锁机制
- Sequelize order排序
- 一篇文章看懂Redis的key命令
- SecureCRT6.0解决中文乱码问题
- Matrix Power Series poj3233矩阵快速幂