牛客多校(2020第五場) E Bogo Sort
阿新 • • 發佈:2020-08-18
題目連結: https://ac.nowcoder.com/acm/contest/5670/E
題意:給出一個置換P,問1~n這n個數有多少種排列,能經過若干次p的置換變為有序序列?答案對10^N取模
題解:找出陣列中,每一個環得長度,求所有環的長度的最小公倍數
難點:大數模板,取環長度
計算環長度模板
1 for(int i=1; i<=n; i++) 2 { 3 if(!vis[i]) 4 { 5 num.clear(); 6 int tmp=i; 7 while(!vis[tmp]) 8 { 9View Codevis[tmp]=1; 10 num.push_back(tmp); 11 tmp=a[tmp]; 12 } 13 f(); 14 } 15 }
大數模板
1 #define MAXN 9999 2 #define MAXSIZE 500 //最大長度 3 #define DLEN 4 4 class BigNum { 5 private: 6 int a[21000]; //控制大數的位數 7 int len; //View Code長度 8 public: 9 BigNum() { len = 1; memset(a, 0, sizeof(a)); } //建構函式 10 void XD(); 11 BigNum(const int); 12 BigNum(const long long int); 13 BigNum(const char*); 14 BigNum(const string&); 15 BigNum(const BigNum&); //拷貝建構函式 16 BigNum& operator = (constBigNum&); //過載賦值運算子 17 BigNum& operator = (const int&); 18 BigNum& operator = (const long long int&); 19 20 friend istream& operator >> (istream&, BigNum&); //過載輸入運算子 21 friend ostream& operator << (ostream&, BigNum&); //過載輸出運算子 22 23 template<typename T> BigNum operator << (const T&) const; 24 template<typename T> BigNum operator >> (const T&) const; 25 26 BigNum operator + (const BigNum&) const; //過載加法運算子,大數加大數 27 BigNum operator - (const BigNum&) const; //過載減法運算子,大數減大數 28 BigNum operator * (const BigNum&) const; //過載乘法運算子,大數乘大數 29 bool operator > (const BigNum& b)const; //過載大於 30 bool operator < (const BigNum& b) const; //過載小於 31 bool operator == (const BigNum& b) const; //過載等於符號 32 template<typename T> BigNum operator / (const T&) const; //過載除法運算子,大數除整數 33 template<typename T> BigNum operator ^ (const T&) const; //大數的n次方 34 template<typename T> T operator % (const T&) const; //大數對int取模 35 36 template<typename T> BigNum operator + (const T& b) const { BigNum t = b; t = *this + t; return t; } 37 template<typename T> BigNum operator - (const T& b) const { BigNum t = b; t = *this - t; return t; } 38 template<typename T> BigNum operator * (const T& b) const { BigNum t = b; t = (*this) * t; return t; } 39 template<typename T> bool operator < (const T& b) const { BigNum t = b; return ((*this) < t); } 40 template<typename T> bool operator > (const T& b) const { BigNum t = b; return ((*this) > t); } 41 template<typename T> bool operator == (const T& b) const { BigNum t = b; return ((*this) == t); } 42 43 bool operator <= (const BigNum& b) const { return (*this) < b || (*this) == b; } 44 bool operator >= (const BigNum& b) const { return (*this) > b || (*this) == b; } 45 bool operator != (const BigNum& b) const { return !((*this) == b); } 46 47 template<typename T> bool operator >= (const T& b) const { BigNum t = b; return !((*this) < t); } 48 template<typename T> bool operator <= (const T& b) const { BigNum t = b; return !((*this) > t); } 49 template<typename T> bool operator != (const T& b) const { BigNum t = b; return !((*this) == t); } 50 51 BigNum& operator += (const BigNum& b) { *this = *this + b; return *this; } 52 BigNum& operator -= (const BigNum& b) { *this = *this - b; return *this; } 53 BigNum& operator *= (const BigNum& b) { *this = *this * b; return *this; } 54 template<typename T> BigNum& operator /= (const T& b) { *this = *this / b; return *this; } 55 template<typename T> BigNum& operator %= (const T& b) { *this = *this % b; return *this; } 56 template<typename T> BigNum& operator += (const T& b) { *this = *this + b; return *this; } 57 template<typename T> BigNum& operator -= (const T& b) { *this = *this - b; return *this; } 58 template<typename T> BigNum& operator *= (const T& b) { *this = *this * b; return *this; } 59 template<typename T> BigNum& operator ^= (const T& b) { *this = *this ^ b; return *this; } 60 61 BigNum operator ++ (int) { BigNum t = *this; *this += 1; return t; } 62 BigNum operator -- (int) { BigNum t = *this; *this -= 1; return t; } 63 BigNum& operator -- () { *this -= 1; return *this; } 64 BigNum& operator ++ () { *this += 1; return *this; } 65 66 template<typename T> BigNum& operator <<= (const T& b) { *this = *this << b; return *this; } 67 template<typename T> BigNum& operator >>= (const T& b) { *this = *this >> b; return *this; } 68 69 template<typename T> BigNum friend operator + (const T& a, const BigNum& b) { BigNum t = a; t = t + a; return t; } 70 template<typename T> BigNum friend operator - (const T& a, const BigNum& b) { BigNum t = a; t = t - b; return t; } 71 template<typename T> BigNum friend operator * (const T& a, const BigNum& b) { BigNum t = a; t = t * b; return t; } 72 template<typename T> friend bool operator < (const T& a, const BigNum& b) { return b > a; } 73 template<typename T> friend bool operator > (const T& a, const BigNum& b) { return b < a; } 74 template<typename T> friend bool operator <= (const T& a, const BigNum& b) { return b >= a; } 75 template<typename T> friend bool operator >= (const T& a, const BigNum& b) { return b <= a; } 76 template<typename T> friend bool operator == (const T& a, const BigNum& b) { return b == a; } 77 template<typename T> friend bool operator != (const T& a, const BigNum& b) { return b != a; } 78 79 void print(); //輸出大數 80 int Size(); //返回大數長度 81 int the_first(); //返回第一個數字 82 int the_last(); //返回最後一位數字 83 int to_int(); //轉化為整數 84 long long int to_long(); 85 string to_String(); //轉化為string型別 86 //char* to_char(); 87 }; 88 89 BigNum::BigNum(const int b) //將一個int型別的變數轉化為大數 90 { 91 int c, d = b; 92 len = 0; 93 memset(a, 0, sizeof(a)); 94 while (d > MAXN) { 95 c = d - (d / (MAXN + 1)) * (MAXN + 1); 96 d = d / (MAXN + 1); 97 a[len++] = c; 98 } 99 a[len++] = d; 100 } 101 BigNum::BigNum(const long long int b) 102 { 103 long long int c, d = b; 104 len = 0; 105 memset(a, 0, sizeof(a)); 106 while (d > MAXN) { 107 c = d - (d / (MAXN + 1)) * (MAXN + 1); 108 d = d / (MAXN + 1); 109 a[len++] = c; 110 } 111 a[len++] = d; 112 } 113 BigNum::BigNum(const string& s) 114 { 115 int t, k, index, l, i; 116 memset(a, 0, sizeof(a)); 117 l = s.size(); 118 len = l / DLEN; 119 if (l % DLEN) 120 len++; 121 index = 0; 122 for (i = l - 1; i >= 0; i -= DLEN) { 123 t = 0; 124 k = i - DLEN + 1; 125 if (k < 0) k = 0; 126 for (int j = k; j <= i; j++) 127 t = t * 10 + s[j] - '0'; 128 a[index++] = t; 129 } 130 } 131 BigNum::BigNum(const char* s) //將一個字串型別的變數轉化為大數 132 { 133 int t, k, index, l, i; 134 memset(a, 0, sizeof(a)); 135 l = strlen(s); 136 len = l / DLEN; 137 if (l % DLEN) 138 len++; 139 index = 0; 140 for (i = l - 1; i >= 0; i -= DLEN) { 141 t = 0; 142 k = i - DLEN + 1; 143 if (k < 0) k = 0; 144 for (int j = k; j <= i; j++) 145 t = t * 10 + s[j] - '0'; 146 a[index++] = t; 147 } 148 } 149 BigNum::BigNum(const BigNum& b) : len(b.len) //拷貝建構函式 150 { 151 memset(a, 0, sizeof(a)); 152 for (int i = 0; i < len; i++) 153 a[i] = b.a[i]; 154 } 155 BigNum& BigNum::operator = (const BigNum& n) //過載賦值運算子,大數之間進行賦值運算 156 { 157 len = n.len; 158 memset(a, 0, sizeof(a)); 159 for (int i = 0; i < len; i++) 160 a[i] = n.a[i]; 161 return *this; 162 } 163 BigNum& BigNum::operator = (const int& num) 164 { 165 BigNum t(num); 166 *this = t; 167 return *this; 168 } 169 BigNum& BigNum::operator = (const long long int& num) 170 { 171 BigNum t(num); 172 *this = t; 173 return *this; 174 } 175 void XD() 176 { 177 cout << "A hidden egg! Good luck for u!" << endl; 178 } 179 180 template<typename T> BigNum BigNum::operator << (const T& b) const 181 { 182 T temp = 1; 183 for (int i = 0; i < b; i++) 184 temp *= 2; 185 BigNum t = (*this) * temp; 186 return t; 187 } 188 template<typename T> BigNum BigNum::operator >> (const T& b) const 189 { 190 T temp = 1; 191 for (int i = 0; i < b; i++) 192 temp *= 2; 193 BigNum t = (*this) / temp; 194 return t; 195 } 196 197 BigNum BigNum::operator + (const BigNum& b) const //兩個大數之間的相加運算 198 { 199 BigNum t(*this); 200 int i, big; 201 big = b.len > len ? b.len : len; 202 for (i = 0; i < big; i++) { 203 t.a[i] += b.a[i]; 204 if (t.a[i] > MAXN) { 205 t.a[i + 1]++; 206 t.a[i] -= MAXN + 1; 207 } 208 } 209 if (t.a[big] != 0) 210 t.len = big + 1; 211 else 212 t.len = big; 213 return t; 214 } 215 BigNum BigNum::operator - (const BigNum& b) const //兩個大數之間的相減運算 216 { 217 int i, j, big; 218 bool flag; 219 BigNum t1, t2; 220 if (*this > b) { 221 t1 = *this; 222 t2 = b; 223 flag = 0; 224 } 225 else { 226 t1 = b; 227 t2 = *this; 228 flag = 1; 229 } 230 big = t1.len; 231 for (i = 0; i < big; i++) { 232 if (t1.a[i] < t2.a[i]) { 233 j = i + 1; 234 while (t1.a[j] == 0) 235 j++; 236 t1.a[j--]--; 237 while (j > i) 238 t1.a[j--] += MAXN; 239 t1.a[i] += MAXN + 1 - t2.a[i]; 240 } 241 else 242 t1.a[i] -= t2.a[i]; 243 } 244 t1.len = big; 245 while (t1.a[t1.len - 1] == 0 && t1.len > 1) { 246 t1.len--; 247 big--; 248 } 249 if (flag) 250 t1.a[big - 1] = 0 - t1.a[big - 1]; 251 return t1; 252 } 253 254 BigNum BigNum::operator * (const BigNum& b) const //兩個大數之間的相乘運算 255 { 256 BigNum ret; 257 int i, j, up; 258 int temp, temp1; 259 for (i = 0; i < len; i++) { 260 up = 0; 261 for (j = 0; j < b.len; j++) { 262 temp = a[i] * b.a[j] + ret.a[i + j] + up; 263 if (temp > MAXN) { 264 temp1 = temp - temp / (MAXN + 1) * (MAXN + 1); 265 up = temp / (MAXN + 1); 266 ret.a[i + j] = temp1; 267 } 268 else { 269 up = 0; 270 ret.a[i + j] = temp; 271 } 272 } 273 if (up != 0) ret.a[i + j] = up; 274 } 275 ret.len = i + j; 276 while (ret.a[ret.len - 1] == 0 && ret.len > 1) 277 ret.len--; 278 return ret; 279 } 280 template<typename T> BigNum BigNum::operator / (const T& b) const 281 { 282 BigNum ret; 283 T i, down = 0; 284 for (i = len - 1; i >= 0; i--) { 285 ret.a[i] = (a[i] + down * (MAXN + 1)) / b; 286 down = a[i] + down * (MAXN + 1) - ret.a[i] * b; 287 } 288 ret.len = len; 289 while (ret.a[ret.len - 1] == 0 && ret.len > 1) 290 ret.len--; 291 return ret; 292 } 293 template<typename T> T BigNum::operator % (const T& b) const 294 { 295 T i, d = 0; 296 for (i = len - 1; i >= 0; i--) { 297 d = ((d * (MAXN + 1)) % b + a[i]) % b; 298 } 299 return d; 300 } 301 302 303 template<typename T> BigNum BigNum::operator^(const T& n) const //大數的n次方運算 304 { 305 BigNum t, ret(1); 306 int i; 307 if (n < 0) return 0; 308 if (n == 0) 309 return 1; 310 if (n == 1) 311 return *this; 312 int m = n; 313 while (m > 1) { 314 t = *this; 315 for (i = 1; (i << 1) <= m; i <<= 1) 316 t = t * t; 317 m -= i; 318 ret = ret * t; 319 if (m == 1) ret = ret * (*this); 320 } 321 return ret; 322 } 323 324 bool BigNum::operator > (const BigNum& b) const //大數和另一個大數的大小比較 325 { 326 int tot; 327 if (len > b.len) 328 return true; 329 else if (len == b.len) { 330 tot = len - 1; 331 while (a[tot] == b.a[tot] && tot >= 0) 332 tot--; 333 if (tot >= 0 && a[tot] > b.a[tot]) 334 return true; 335 else 336 return false; 337 } 338 else 339 return false; 340 } 341 342 bool BigNum::operator < (const BigNum& b) const 343 { 344 int tot; 345 if (len > b.len) 346 return false; 347 else if (len == b.len) { 348 tot = len - 1; 349 while (a[tot] == b.a[tot] && tot >= 0) 350 tot--; 351 if (tot >= 0 && a[tot] > b.a[tot]) 352 return false; 353 else 354 return false; 355 } 356 else 357 return true; 358 } 359 360 bool BigNum::operator == (const BigNum& b) const 361 { 362 int tot = len - 1; 363 if (len != b.len) 364 return false; 365 while (a[tot] == b.a[tot] && tot >= 0) 366 tot--; 367 if (tot < 0) 368 return true; 369 return false; 370 } 371 int n; 372 void BigNum::print() //輸出大數 373 { 374 int i; 375 if (len >= n) { 376 cout << a[len - 1]; 377 for (i = len - 2; i >= len - n; i--) { 378 cout.width(DLEN); 379 cout.fill('0'); 380 cout << a[i]; 381 } 382 cout << endl; 383 } 384 else { 385 cout << a[len - 1]; 386 for (i = len - 2; i >= 0; i--) { 387 cout.width(DLEN); 388 cout.fill('0'); 389 cout << a[i]; 390 } 391 cout << endl; 392 } 393 } 394 int BigNum::Size() 395 { 396 int t = a[len - 1], cnt = 0; 397 while (t) { t /= 10; cnt++; } 398 cnt += (len - 1) * 4; 399 return cnt; 400 } 401 int BigNum::the_first() 402 { 403 int t = a[len - 1]; 404 while (t > 10) { t /= 10; } 405 return t; 406 } 407 int BigNum::the_last() 408 { 409 int t = a[0]; 410 return t % 10; 411 } 412 int BigNum::to_int() 413 { 414 int i, num; 415 num = a[len - 1]; 416 for (i = len - 2; i >= 0; i--) 417 num = num * (MAXN + 1) + a[i]; 418 return num; 419 } 420 long long int BigNum::to_long() 421 { 422 int i; 423 long long int num; 424 num = a[len - 1]; 425 for (i = len - 2; i >= 0; i--) 426 num = num * (MAXN + 1) + a[i]; 427 return num; 428 } 429 string BigNum::to_String() 430 { 431 int i; 432 string s = "", tp = ""; 433 s += to_string(a[len - 1]); 434 for (i = len - 2; i >= 0; i--) { 435 tp = to_string(a[i]); 436 int tot = tp.size(); 437 tp.insert(tp.begin(), 4 - tot, '0'); 438 s = s + tp; 439 } 440 return s; 441 }
ac程式碼
1 #include<iostream> 2 #include<cstring> 3 #include<string> 4 #include<cstdio> 5 #include<algorithm> 6 7 using namespace std; 8 #define maxn 100100 9 #define MAXN 9999 10 #define MAXSIZE 500 //最大長度 11 #define DLEN 4 12 13 class BigNum { 14 private: 15 int a[21000]; //控制大數的位數 16 int len; //長度 17 public: 18 BigNum() { len = 1; memset(a, 0, sizeof(a)); } //建構函式 19 void XD(); 20 BigNum(const int); 21 BigNum(const long long int); 22 BigNum(const char*); 23 BigNum(const string&); 24 BigNum(const BigNum&); //拷貝建構函式 25 BigNum& operator = (const BigNum&); //過載賦值運算子 26 BigNum& operator = (const int&); 27 BigNum& operator = (const long long int&); 28 29 friend istream& operator >> (istream&, BigNum&); //過載輸入運算子 30 friend ostream& operator << (ostream&, BigNum&); //過載輸出運算子 31 32 template<typename T> BigNum operator << (const T&) const; 33 template<typename T> BigNum operator >> (const T&) const; 34 35 BigNum operator + (const BigNum&) const; //過載加法運算子,大數加大數 36 BigNum operator - (const BigNum&) const; //過載減法運算子,大數減大數 37 BigNum operator * (const BigNum&) const; //過載乘法運算子,大數乘大數 38 bool operator > (const BigNum& b)const; //過載大於 39 bool operator < (const BigNum& b) const; //過載小於 40 bool operator == (const BigNum& b) const; //過載等於符號 41 template<typename T> BigNum operator / (const T&) const; //過載除法運算子,大數除整數 42 template<typename T> BigNum operator ^ (const T&) const; //大數的n次方 43 template<typename T> T operator % (const T&) const; //大數對int取模 44 45 template<typename T> BigNum operator + (const T& b) const { BigNum t = b; t = *this + t; return t; } 46 template<typename T> BigNum operator - (const T& b) const { BigNum t = b; t = *this - t; return t; } 47 template<typename T> BigNum operator * (const T& b) const { BigNum t = b; t = (*this) * t; return t; } 48 template<typename T> bool operator < (const T& b) const { BigNum t = b; return ((*this) < t); } 49 template<typename T> bool operator > (const T& b) const { BigNum t = b; return ((*this) > t); } 50 template<typename T> bool operator == (const T& b) const { BigNum t = b; return ((*this) == t); } 51 52 bool operator <= (const BigNum& b) const { return (*this) < b || (*this) == b; } 53 bool operator >= (const BigNum& b) const { return (*this) > b || (*this) == b; } 54 bool operator != (const BigNum& b) const { return !((*this) == b); } 55 56 template<typename T> bool operator >= (const T& b) const { BigNum t = b; return !((*this) < t); } 57 template<typename T> bool operator <= (const T& b) const { BigNum t = b; return !((*this) > t); } 58 template<typename T> bool operator != (const T& b) const { BigNum t = b; return !((*this) == t); } 59 60 BigNum& operator += (const BigNum& b) { *this = *this + b; return *this; } 61 BigNum& operator -= (const BigNum& b) { *this = *this - b; return *this; } 62 BigNum& operator *= (const BigNum& b) { *this = *this * b; return *this; } 63 template<typename T> BigNum& operator /= (const T& b) { *this = *this / b; return *this; } 64 template<typename T> BigNum& operator %= (const T& b) { *this = *this % b; return *this; } 65 template<typename T> BigNum& operator += (const T& b) { *this = *this + b; return *this; } 66 template<typename T> BigNum& operator -= (const T& b) { *this = *this - b; return *this; } 67 template<typename T> BigNum& operator *= (const T& b) { *this = *this * b; return *this; } 68 template<typename T> BigNum& operator ^= (const T& b) { *this = *this ^ b; return *this; } 69 70 BigNum operator ++ (int) { BigNum t = *this; *this += 1; return t; } 71 BigNum operator -- (int) { BigNum t = *this; *this -= 1; return t; } 72 BigNum& operator -- () { *this -= 1; return *this; } 73 BigNum& operator ++ () { *this += 1; return *this; } 74 75 template<typename T> BigNum& operator <<= (const T& b) { *this = *this << b; return *this; } 76 template<typename T> BigNum& operator >>= (const T& b) { *this = *this >> b; return *this; } 77 78 template<typename T> BigNum friend operator + (const T& a, const BigNum& b) { BigNum t = a; t = t + a; return t; } 79 template<typename T> BigNum friend operator - (const T& a, const BigNum& b) { BigNum t = a; t = t - b; return t; } 80 template<typename T> BigNum friend operator * (const T& a, const BigNum& b) { BigNum t = a; t = t * b; return t; } 81 template<typename T> friend bool operator < (const T& a, const BigNum& b) { return b > a; } 82 template<typename T> friend bool operator > (const T& a, const BigNum& b) { return b < a; } 83 template<typename T> friend bool operator <= (const T& a, const BigNum& b) { return b >= a; } 84 template<typename T> friend bool operator >= (const T& a, const BigNum& b) { return b <= a; } 85 template<typename T> friend bool operator == (const T& a, const BigNum& b) { return b == a; } 86 template<typename T> friend bool operator != (const T& a, const BigNum& b) { return b != a; } 87 88 void print(); //輸出大數 89 int Size(); //返回大數長度 90 int the_first(); //返回第一個數字 91 int the_last(); //返回最後一位數字 92 int to_int(); //轉化為整數 93 long long int to_long(); 94 string to_String(); //轉化為string型別 95 //char* to_char(); 96 }; 97 98 BigNum::BigNum(const int b) //將一個int型別的變數轉化為大數 99 { 100 int c, d = b; 101 len = 0; 102 memset(a, 0, sizeof(a)); 103 while (d > MAXN) { 104 c = d - (d / (MAXN + 1)) * (MAXN + 1); 105 d = d / (MAXN + 1); 106 a[len++] = c; 107 } 108 a[len++] = d; 109 } 110 BigNum::BigNum(const long long int b) 111 { 112 long long int c, d = b; 113 len = 0; 114 memset(a, 0, sizeof(a)); 115 while (d > MAXN) { 116 c = d - (d / (MAXN + 1)) * (MAXN + 1); 117 d = d / (MAXN + 1); 118 a[len++] = c; 119 } 120 a[len++] = d; 121 } 122 BigNum::BigNum(const string& s) 123 { 124 int t, k, index, l, i; 125 memset(a, 0, sizeof(a)); 126 l = s.size(); 127 len = l / DLEN; 128 if (l % DLEN) 129 len++; 130 index = 0; 131 for (i = l - 1; i >= 0; i -= DLEN) { 132 t = 0; 133 k = i - DLEN + 1; 134 if (k < 0) k = 0; 135 for (int j = k; j <= i; j++) 136 t = t * 10 + s[j] - '0'; 137 a[index++] = t; 138 } 139 } 140 BigNum::BigNum(const char* s) //將一個字串型別的變數轉化為大數 141 { 142 int t, k, index, l, i; 143 memset(a, 0, sizeof(a)); 144 l = strlen(s); 145 len = l / DLEN; 146 if (l % DLEN) 147 len++; 148 index = 0; 149 for (i = l - 1; i >= 0; i -= DLEN) { 150 t = 0; 151 k = i - DLEN + 1; 152 if (k < 0) k = 0; 153 for (int j = k; j <= i; j++) 154 t = t * 10 + s[j] - '0'; 155 a[index++] = t; 156 } 157 } 158 BigNum::BigNum(const BigNum& b) : len(b.len) //拷貝建構函式 159 { 160 memset(a, 0, sizeof(a)); 161 for (int i = 0; i < len; i++) 162 a[i] = b.a[i]; 163 } 164 BigNum& BigNum::operator = (const BigNum& n) //過載賦值運算子,大數之間進行賦值運算 165 { 166 len = n.len; 167 memset(a, 0, sizeof(a)); 168 for (int i = 0; i < len; i++) 169 a[i] = n.a[i]; 170 return *this; 171 } 172 BigNum& BigNum::operator = (const int& num) 173 { 174 BigNum t(num); 175 *this = t; 176 return *this; 177 } 178 BigNum& BigNum::operator = (const long long int& num) 179 { 180 BigNum t(num); 181 *this = t; 182 return *this; 183 } 184 void XD() 185 { 186 cout << "A hidden egg! Good luck for u!" << endl; 187 } 188 189 template<typename T> BigNum BigNum::operator << (const T& b) const 190 { 191 T temp = 1; 192 for (int i = 0; i < b; i++) 193 temp *= 2; 194 BigNum t = (*this) * temp; 195 return t; 196 } 197 template<typename T> BigNum BigNum::operator >> (const T& b) const 198 { 199 T temp = 1; 200 for (int i = 0; i < b; i++) 201 temp *= 2; 202 BigNum t = (*this) / temp; 203 return t; 204 } 205 206 BigNum BigNum::operator + (const BigNum& b) const //兩個大數之間的相加運算 207 { 208 BigNum t(*this); 209 int i, big; 210 big = b.len > len ? b.len : len; 211 for (i = 0; i < big; i++) { 212 t.a[i] += b.a[i]; 213 if (t.a[i] > MAXN) { 214 t.a[i + 1]++; 215 t.a[i] -= MAXN + 1; 216 } 217 } 218 if (t.a[big] != 0) 219 t.len = big + 1; 220 else 221 t.len = big; 222 return t; 223 } 224 BigNum BigNum::operator - (const BigNum& b) const //兩個大數之間的相減運算 225 { 226 int i, j, big; 227 bool flag; 228 BigNum t1, t2; 229 if (*this > b) { 230 t1 = *this; 231 t2 = b; 232 flag = 0; 233 } 234 else { 235 t1 = b; 236 t2 = *this; 237 flag = 1; 238 } 239 big = t1.len; 240 for (i = 0; i < big; i++) { 241 if (t1.a[i] < t2.a[i]) { 242 j = i + 1; 243 while (t1.a[j] == 0) 244 j++; 245 t1.a[j--]--; 246 while (j > i) 247 t1.a[j--] += MAXN; 248 t1.a[i] += MAXN + 1 - t2.a[i]; 249 } 250 else 251 t1.a[i] -= t2.a[i]; 252 } 253 t1.len = big; 254 while (t1.a[t1.len - 1] == 0 && t1.len > 1) { 255 t1.len--; 256 big--; 257 } 258 if (flag) 259 t1.a[big - 1] = 0 - t1.a[big - 1]; 260 return t1; 261 } 262 263 BigNum BigNum::operator * (const BigNum& b) const //兩個大數之間的相乘運算 264 { 265 BigNum ret; 266 int i, j, up; 267 int temp, temp1; 268 for (i = 0; i < len; i++) { 269 up = 0; 270 for (j = 0; j < b.len; j++) { 271 temp = a[i] * b.a[j] + ret.a[i + j] + up; 272 if (temp > MAXN) { 273 temp1 = temp - temp / (MAXN + 1) * (MAXN + 1); 274 up = temp / (MAXN + 1); 275 ret.a[i + j] = temp1; 276 } 277 else { 278 up = 0; 279 ret.a[i + j] = temp; 280 } 281 } 282 if (up != 0) ret.a[i + j] = up; 283 } 284 ret.len = i + j; 285 while (ret.a[ret.len - 1] == 0 && ret.len > 1) 286 ret.len--; 287 return ret; 288 } 289 template<typename T> BigNum BigNum::operator / (const T& b) const 290 { 291 BigNum ret; 292 T i, down = 0; 293 for (i = len - 1; i >= 0; i--) { 294 ret.a[i] = (a[i] + down * (MAXN + 1)) / b; 295 down = a[i] + down * (MAXN + 1) - ret.a[i] * b; 296 } 297 ret.len = len; 298 while (ret.a[ret.len - 1] == 0 && ret.len > 1) 299 ret.len--; 300 return ret; 301 } 302 template<typename T> T BigNum::operator % (const T& b) const 303 { 304 T i, d = 0; 305 for (i = len - 1; i >= 0; i--) { 306 d = ((d * (MAXN + 1)) % b + a[i]) % b; 307 } 308 return d; 309 } 310 311 312 template<typename T> BigNum BigNum::operator^(const T& n) const //大數的n次方運算 313 { 314 BigNum t, ret(1); 315 int i; 316 if (n < 0) return 0; 317 if (n == 0) 318 return 1; 319 if (n == 1) 320 return *this; 321 int m = n; 322 while (m > 1) { 323 t = *this; 324 for (i = 1; (i << 1) <= m; i <<= 1) 325 t = t * t; 326 m -= i; 327 ret = ret * t; 328 if (m == 1) ret = ret * (*this); 329 } 330 return ret; 331 } 332 333 bool BigNum::operator > (const BigNum& b) const //大數和另一個大數的大小比較 334 { 335 int tot; 336 if (len > b.len) 337 return true; 338 else if (len == b.len) { 339 tot = len - 1; 340 while (a[tot] == b.a[tot] && tot >= 0) 341 tot--; 342 if (tot >= 0 && a[tot] > b.a[tot]) 343 return true; 344 else 345 return false; 346 } 347 else 348 return false; 349 } 350 351 bool BigNum::operator < (const BigNum& b) const 352 { 353 int tot; 354 if (len > b.len) 355 return false; 356 else if (len == b.len) { 357 tot = len - 1; 358 while (a[tot] == b.a[tot] && tot >= 0) 359 tot--; 360 if (tot >= 0 && a[tot] > b.a[tot]) 361 return false; 362 else 363 return false; 364 } 365 else 366 return true; 367 } 368 369 bool BigNum::operator == (const BigNum& b) const 370 { 371 int tot = len - 1; 372 if (len != b.len) 373 return false; 374 while (a[tot] == b.a[tot] && tot >= 0) 375 tot--; 376 if (tot < 0) 377 return true; 378 return false; 379 } 380 381 int n; //定義n 382 383 void BigNum::print() //輸出大數 384 { 385 int i; 386 if (len >= n) { 387 cout << a[len - 1]; 388 for (i = len - 2; i >= len - n; i--) { 389 cout.width(DLEN); 390 cout.fill('0'); 391 cout << a[i]; 392 } 393 cout << endl; 394 } 395 else { 396 cout << a[len - 1]; 397 for (i = len - 2; i >= 0; i--) { 398 cout.width(DLEN); 399 cout.fill('0'); 400 cout << a[i]; 401 } 402 cout << endl; 403 } 404 } 405 int BigNum::Size() 406 { 407 int t = a[len - 1], cnt = 0; 408 while (t) { t /= 10; cnt++; } 409 cnt += (len - 1) * 4; 410 return cnt; 411 } 412 int BigNum::the_first() 413 { 414 int t = a[len - 1]; 415 while (t > 10) { t /= 10; } 416 return t; 417 } 418 int BigNum::the_last() 419 { 420 int t = a[0]; 421 return t % 10; 422 } 423 int BigNum::to_int() 424 { 425 int i, num; 426 num = a[len - 1]; 427 for (i = len - 2; i >= 0; i--) 428 num = num * (MAXN + 1) + a[i]; 429 return num; 430 } 431 long long int BigNum::to_long() 432 { 433 int i; 434 long long int num; 435 num = a[len - 1]; 436 for (i = len - 2; i >= 0; i--) 437 num = num * (MAXN + 1) + a[i]; 438 return num; 439 } 440 string BigNum::to_String() 441 { 442 int i; 443 string s = "", tp = ""; 444 s += to_string(a[len - 1]); 445 for (i = len - 2; i >= 0; i--) { 446 tp = to_string(a[i]); 447 int tot = tp.size(); 448 tp.insert(tp.begin(), 4 - tot, '0'); 449 s = s + tp; 450 } 451 return s; 452 } 453 454 int p[maxn]; 455 int to[maxn]; 456 int vis[maxn]; 457 458 int gcd1(int x, int y) { 459 return y ? gcd1(y, x % y) : x; 460 } 461 int gcd(BigNum x, int y) { 462 return gcd1(y, x % y); 463 } 464 465 BigNum lcm(BigNum ans, int res) { 466 return ans / gcd(ans, res) * res; 467 } 468 469 int main() { 470 cin >> n; 471 for (int i = 1; i <= n; i++) { 472 scanf("%d", &p[i]); 473 to[i] = p[i]; 474 } 475 476 BigNum ans = BigNum(1); 477 for (int i = 1; i <= n; i++) { //找環的長度 478 if (vis[i]) continue; 479 int tmp = i; 480 int res = 0; //環的長度 481 while (to[tmp] != i) { 482 vis[tmp] = 1; 483 tmp = to[tmp]; 484 res++; 485 } 486 res++; 487 ans = lcm(ans, res); 488 } 489 ans.print(); 490 return 0; 491 }View Code