这竟然是这么不错的题,我原以为是恶搞的水题。。。
题意: 求aa..a%m!的极限
刚开始我是这样做的,既然有极限,那么当式子取模值增大到一定数就不会再增大了,那就直接while循环恶搞啊。。。
原来这题应用到欧拉定理,当时没想这么多,欧拉定理是这样的,如果a和n互质,那么aφ(n)=1(mod n) ,所以对于任意的a,b,n 就有ab=aφ(n)+b mod φ(n)(mod n) 。有了这个定理,题目就好做了,直接递归求解了~具体见代码
#include <stdio.h>
#define LL long long
LL euler(LL n) {
LL ans = n;
for(int i = 2;(LL)i*i <= n; i++) {
if(n%i == 0) {
ans = ans-ans/i;
while(n%i == 0) n /= i;
}
}
if(n > 1) ans = ans-ans/n;
return ans;
}
LL powmod(LL x, LL n, LL mod) {
LL ret = 1;
while(n) {
if(n&1) ret = ret*x%mod;
x = x*x%mod;
n /= 2;
}
return ret;
}
LL Jay(LL n, LL m) {
if(m == 1) return m; // m = 1的时候 x%m + m = m
LL cur = euler(m); // 求欧拉函数
LL now = Jay(n, cur);
LL ans = powmod(n, now, m);
return ans+m;
}
int main() {
int i;
LL n, m;
int flag = 0;
while(scanf("%lld%lld", &n, &m) != -1) {
if(flag) puts("");
LL cur = 1;
for(i = 1;i <= m; i++) cur *= i;
printf("%lld\n", Jay(n, cur)%cur);
flag = 1;
}
}