Calculation
Time Limit: 2000/1000 MS
(Java/Others) Memory Limit: 32768/32768 K
(Java/Others)
Total Submission(s): 1414 Accepted
Submission(s): 291
Problem Description
Assume that f(0) = 1 and 0^0=1. f(n) = (n%10)^f(n/10)
for all n bigger than zero. Please calculate f(n)%m. (2 ≤ n , m ≤ 10^9, x^y
means the y th power of x).
Input
The first line contains a single positive integer T.
which is the number of test cases. T lines follows.Each case consists of one
line containing two positive integers n and m.
Output
One integer indicating the value of f(n)%m.
Sample Input
2 24 20 25 20
Sample Output
16 5
Source
2009
Multi-University Training Contest 3 - Host by WHU
1 /**
2 a ^ b % c= a ^ ( b % phi ( c ) + phi ( c ) ) % c 条件:(b>=c) phi(n)为n的欧拉函数值
3 我想说(⊙o⊙)…,完全搞不懂标程
4 **/
5 #include<iostream>
6 #include<stdio.h>
7 #include<cstring>
8 #include<cstdlib>
9 using namespace std;
10 typedef __int64 LL;
11
12 LL Euler(LL n)
13 {
14 LL temp =n,i;
15 for(i=2;i*i<=n;i++)
16 {
17 if(n%i==0)
18 {
19 while(n%i==0)
20 n=n/i;
21 temp=temp/i*(i-1);
22 }
23 }
24 if(n!=1) temp=temp/n*(n-1);
25 return temp;
26 }
27 LL pow_mod(LL a,LL b,LL p){
28 LL ans=1;
29 while(b)
30 {
31 if(b&1) ans=(ans*a)%p;
32 b=b>>1;
33 a=(a*a)%p;
34 }
35 return ans;
36 }
37 LL fuck(LL a,LL n,LL m)
38 {
39 LL i,ans=1;
40 for(i=1;i<=n;i++)
41 {
42 ans=ans*a;
43 if(ans>=m) return ans;
44 }
45 return ans;
46 }
47 LL dfs(LL n,LL m){
48 LL ans,p,nima;
49 if(n==0) return 1;
50 if(n<10) return n;
51 p = Euler(m);
52 ans=dfs(n/10,p);
53
54 nima = fuck(n%10,ans,m);
55 if(nima>=m){
56 ans=pow_mod(n%10,ans%p+p,m);
57 if(ans==0) return m;
58 }
59 else{
60 ans=pow_mod(n%10,ans,m);
61 }
62 return ans;
63 }
64 int main()
65 {
66 int T;
67 LL n,m;
68 scanf("%d",&T);
69 while(T--){
70 scanf("%I64d%I64d",&n,&m);
71 printf("%I64d\n",dfs(n,m)%m);
72 }
73 return 0;
74 }
hdu 2837 坑题。
时间: 2024-11-02 20:34:05