hdu-2837 Calculation---指数循环节

Posted 努力努力再努力x

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu-2837 Calculation---指数循环节相关的知识,希望对你有一定的参考价值。

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=2837

题目大意:

已知f(0) = 1,0^0 =1,【注意,0的其他任意次方为0,虽然题没有直接给出~】,还已知f(n) = (n%10)^f(n/10),让你求f(n)%m. (2 ≤ n , m ≤ 10^9)

解题思路:

通过这个就可以递归求解。

f(n) = f(n%10)(f(n/10)%Phi(m)+Phi(m))%m

递归返回值就是f(n)%m+m

注意等于0的细节部分

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<cstring>
 5 using namespace std;
 6 typedef long long ll;
 7 int euler_phi(int n)//求单个
 8 {
 9     int m = (int)sqrt(n + 0.5);
10     int ans = n;
11     for(int i = 2; i <= m; i++)if(n % i == 0)
12     {
13         ans = ans / i * (i - 1);
14         while(n % i == 0)n /= i;
15     }
16     if(n > 1)ans = ans / n * (n - 1);
17     return ans;
18 }
19 ll mul(ll a, ll b, ll m)
20 //求a*b%m
21 {
22     ll ans = 0;
23     a %= m;
24     while(b)
25     {
26         if(b & 1)ans = (ans + a) % m;
27         b /= 2;
28         a = (a + a) % m;
29     }
30     return ans;
31 }
32 ll pow(ll a, ll b, ll m)
33 {
34     ll ans = 1;
35     a %= m;
36     while(b)
37     {
38         if(b & 1)ans = mul(a, ans, m);
39         b /= 2;
40         a = mul(a, a, m);
41     }
42     ans %= m;
43     return ans;
44 }
45 ll f(ll n, ll m)
46 {
47     if(n < 10)return n;
48     ll p = euler_phi(m);
49     ll t = f(n / 10, p);
50     ll ans = pow(n % 10, t, m);
51     if(n % 10 == 0 && t != 0)return 0;//直接等于0
52     if(ans == 0)ans = m;//返回值为f(n)%m+m
53     return ans;
54 }
55 int main()
56 {
57     int T;
58     scanf("%d", &T);
59     while(T--)
60     {
61         ll n, m;
62         scanf("%lld%lld", &n, &m);
63         printf("%lld\\n", f(n, m) % m);
64     }
65     return 0;
66 }

 

以上是关于hdu-2837 Calculation---指数循环节的主要内容,如果未能解决你的问题,请参考以下文章

指数循环节&欧拉降幂

hdu_2837_Calculation(欧拉函数,快速幂求指数循环节) (待查

Calculation 2

sci审稿返回意见:power calculation

[Blue Prism] Calculation 的使用

杭电3501Calculation 2 欧拉函数