http://acm.hdu.edu.cn/showproblem.php?pid=2837
f[n] = (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; }