hdu 2837 Calculation(指数循环节)
2014-08-11 17:24
309 查看
http://acm.hdu.edu.cn/showproblem.php?pid=2837
f
= (n%10)^(f[n/10])%m
a^b%c = a^(b%phi[c]+phi[c])%c(b >= phi[c])。每一层都要判断b是否大于等于它外面一层的模。
f
= (n%10)^(f[n/10])%m
a^b%c = a^(b%phi[c]+phi[c])%c(b >= phi[c])。每一层都要判断b是否大于等于它外面一层的模。
#include <stdio.h> #include <iostream> #include <map> #include <set> #include <list> #include <stack> #include <vector> #include <math.h> #include <string.h> #include <queue> #include <string> #include <stdlib.h> #include <algorithm> #define LL long long #define _LL __int64 #define eps 1e-12 #define PI acos(-1.0) #define C 240 #define S 20 using namespace std; const int maxn = 110; const int mod = 1000000007; LL n,m,phi_m; LL Eular(LL num) { LL res = num; for(int i = 2; i*i <= num; i++) { if(num % i == 0) { res -= res/i; while(num%i == 0) num/=i; } } if(num > 1) res -= res/num; return res; } LL pow_mod(LL a, LL n, LL m) { LL res = 1; while(n) { if(n&1) { res = res*a; if(res >= m) res = res%m+m; } a = a*a; if(a >= m) a = a%m+m; n >>= 1; } return res; } LL solve(LL n, LL m) { if(n == 0) return 1; LL p = solve(n/10,Eular(m)); return pow_mod(n%10,p,m); } int main() { int test; scanf("%d",&test); while(test--) { scanf("%lld %lld",&n,&m); LL ans = solve(n,m)%m; printf("%lld\n",ans); } return 0; }
相关文章推荐
- HDU 2837 Calculation (指数循环节)
- HDU 2837 Calculation(指数循环节)
- hdu 2837 Calculation 指数循环节
- hdu 2837 Calculation【欧拉函数,快速幂求指数循环节】
- HDU 2837 Calculation(指数循环节)
- 【HDU 5895】【指数循环节 矩阵 快速幂 逆元 推公式】Mathematician QSC 由递推式推公式
- HDU 5895 Mathematician QSC (矩阵快速幂 + 逆元应用 + 指数循环节 + 欧拉函数)
- HDU 2837 Calculation
- HDU2837 Calculation【指数循环节】
- hdu 3221 (指数循环节)
- hdu 3307 简单的指数循环节
- hdu 2837 Calculation 数论
- hdu 5728 (公式推导+指数循环节)
- HDU 2837 Calculation
- hdu 5895 Mathematician QSC 指数循环节+矩阵快速幂
- hdu 3221 Brute-force Algorithm 指数循环节
- HDU 5895 矩阵快速幂+欧拉降幂公式+指数循环节
- hdu 2837 Calculation
- hdu 2837 Calculation
- HDU 5728 PowMod (欧拉函数+指数循环节)