首页 > 代码库 > UVa 10692 Huge Mods

UVa 10692 Huge Mods

方法:数论

其实不是很明白,为什么这个公式可行

a^b % m = a^(b%phi[m] + phi[m]) % m

code:

技术分享
  1 #include <cstdio>
  2 #include <cstring>
  3 #include <algorithm>
  4 #include <iostream>
  5 #include <string>
  6 #include <vector>
  7 #include <stack>
  8 #include <bitset>
  9 #include <cstdlib>
 10 #include <cmath>
 11 #include <set>
 12 #include <list>
 13 #include <deque>
 14 #include <map>
 15 #include <queue>
 16 #include <fstream>
 17 #include <cassert>
 18 #include <unordered_map>
 19 #include <unordered_set>
 20 #include <cmath>
 21 #include <sstream>
 22 #include <time.h>
 23 #include <complex>
 24 #include <iomanip>
 25 #define Max(a,b) ((a)>(b)?(a):(b))
 26 #define Min(a,b) ((a)<(b)?(a):(b))
 27 #define FOR(a,b,c) for (ll (a)=(b);(a)<(c);++(a))
 28 #define FORN(a,b,c) for (ll (a)=(b);(a)<=(c);++(a))
 29 #define DFOR(a,b,c) for (ll (a)=(b);(a)>=(c);--(a))
 30 #define FORSQ(a,b,c) for (ll (a)=(b);(a)*(a)<=(c);++(a))
 31 #define FORC(a,b,c) for (char (a)=(b);(a)<=(c);++(a))
 32 #define FOREACH(a,b) for (auto &(a) : (b))
 33 #define rep(i,n) FOR(i,0,n)
 34 #define repn(i,n) FORN(i,1,n)
 35 #define drep(i,n) DFOR(i,n-1,0)
 36 #define drepn(i,n) DFOR(i,n,1)
 37 #define MAX(a,b) a = Max(a,b)
 38 #define MIN(a,b) a = Min(a,b)
 39 #define SQR(x) ((LL)(x) * (x))
 40 #define Reset(a,b) memset(a,b,sizeof(a))
 41 #define fi first
 42 #define se second
 43 #define mp make_pair
 44 #define pb push_back
 45 #define all(v) v.begin(),v.end()
 46 #define ALLA(arr,sz) arr,arr+sz
 47 #define SIZE(v) (int)v.size()
 48 #define SORT(v) sort(all(v))
 49 #define REVERSE(v) reverse(ALL(v))
 50 #define SORTA(arr,sz) sort(ALLA(arr,sz))
 51 #define REVERSEA(arr,sz) reverse(ALLA(arr,sz))
 52 #define PERMUTE next_permutation
 53 #define TC(t) while(t--)
 54 #define forever for(;;)
 55 #define PINF 1000000000000
 56 #define newline ‘\n‘
 57 
 58 #define test if(1)if(0)cerr
 59 using namespace std;
 60 using namespace std;
 61 typedef vector<int> vi;
 62 typedef vector<vi> vvi;
 63 typedef pair<int,int> ii;
 64 typedef pair<double,double> dd;
 65 typedef pair<char,char> cc;
 66 typedef vector<ii> vii;
 67 typedef long long ll;
 68 typedef unsigned long long ull;
 69 typedef pair<ll, ll> l4;
 70 const double pi = acos(-1.0);
 71 
 72 int phi(int n)
 73 {
 74     int ret = n;
 75     for (int i = 2; i * i <= n; ++i)
 76     {
 77         if (n % i) continue;
 78         ret -= ret/i;
 79         while (n % i == 0) n /= i;
 80     }
 81     if (n != 1)
 82         ret -= ret/n;
 83     return ret;
 84 }
 85 int m, n;
 86 int a[10];
 87 ll pow_mod(ll base, ll p, ll mod)
 88 {
 89     if (!base) return 0;
 90     ll ret = 1;
 91     while (p)
 92     {
 93         if (p & 1) ret = ret * base % mod;
 94         p >>= 1;
 95         base = base * base % mod;
 96     }
 97     return ret;
 98 }
 99 int dfs(int cur, int mod)
100 {
101     if (cur == n-1) return a[cur] % mod;
102     int ph = phi(mod);
103     return pow_mod(a[cur], dfs(cur+1, ph)%ph + ph, mod);
104 }
105 int main()
106 {
107     int kase = 0;
108     while (cin >> m >> n)
109     {
110         rep(i, n) cin >> a[i];
111         cout << "Case #" << ++kase << ": " << dfs(0, m) << newline;
112     }
113 }
114 /*
115  10 4 2 3 4 5
116  100 2 5 2
117  53 3 2 3 2
118  #
119 */
View Code

 

UVa 10692 Huge Mods