题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1395
题意:给出n,找2^x mod n = 1的最小的x。
欧拉函数是费马小定理的一个特殊应用:2^phi(x)=1 (mod x),当且仅当x为素数的时候式子成立,因为x为素数时,比x小且与x互质的数的个数为x-1,即满足费马小定理2^(x-1)=1(mod x)。
1 #include <algorithm> 2 #include <iostream> 3 #include <iomanip> 4 #include <cstring> 5 #include <climits> 6 #include <complex> 7 #include <fstream> 8 #include <cassert> 9 #include <cstdio> 10 #include <bitset> 11 #include <vector> 12 #include <deque> 13 #include <queue> 14 #include <stack> 15 #include <ctime> 16 #include <set> 17 #include <map> 18 #include <cmath> 19 using namespace std; 20 #define fr first 21 #define sc second 22 #define cl clear 23 #define BUG puts("here!!!") 24 #define W(a) while(a--) 25 #define pb(a) push_back(a) 26 #define Rint(a) scanf("%d", &a) 27 #define Rll(a) scanf("%I64d", &a) 28 #define Rs(a) scanf("%s", a) 29 #define Cin(a) cin >> a 30 #define FRead() freopen("in", "r", stdin) 31 #define FWrite() freopen("out", "w", stdout) 32 #define Rep(i, len) for(int i = 0; i < (len); i++) 33 #define For(i, a, len) for(int i = (a); i < (len); i++) 34 #define Cls(a) memset((a), 0, sizeof(a)) 35 #define Clr(a, x) memset((a), (x), sizeof(a)) 36 #define Full(a) memset((a), 0x7f7f7f, sizeof(a)) 37 #define lrt rt << 1 38 #define rrt rt << 1 | 1 39 #define pi 3.14159265359 40 #define RT return 41 #define lowbit(x) x & (-x) 42 #define onecnt(x) __builtin_popcount(x) 43 typedef long long LL; 44 typedef long double LD; 45 typedef unsigned long long ULL; 46 typedef pair<int, int> pii; 47 typedef pair<string, int> psi; 48 typedef pair<LL, LL> pll; 49 typedef map<string, int> msi; 50 typedef vector<int> vi; 51 typedef vector<LL> vl; 52 typedef vector<vl> vvl; 53 typedef vector<bool> vb; 54 55 const int maxn = 5500; 56 LL n; 57 LL geteular(LL x) { 58 LL ret = 1; 59 LL i; 60 for(i = 1; i < maxn; i++) { 61 ret *= 2; 62 ret %= x; 63 if(ret == 1) break; 64 } 65 return i; 66 } 67 68 int main() { 69 // FRead(); 70 while(cin >> n) { 71 if(n == 1 || n % 2 == 0) { 72 printf("2^? mod %I64d = 1 ", n); 73 continue; 74 } 75 cout << "2^" << geteular(n) << " mod " << n << " = 1" << endl; 76 } 77 RT 0; 78 }