結果
問題 | No.101 ぐるぐる!あみだくじ! |
ユーザー |
![]() |
提出日時 | 2014-11-28 08:45:37 |
言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 3 ms / 5,000 ms |
コード長 | 1,901 bytes |
コンパイル時間 | 1,061 ms |
コンパイル使用メモリ | 78,240 KB |
実行使用メモリ | 6,824 KB |
最終ジャッジ日時 | 2025-01-03 10:05:20 |
合計ジャッジ時間 | 2,215 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 37 |
ソースコード
//想定解法 dfs//1.あみだくじを1回だけシミュレートして置換先を決定し、置換先同士を繋げたグラフにする// この時ループしている部分は一つの環になる。//2.グラフをdfsして部分のループの長さを得る//3.ループの長さの最小公倍数が答え//n<=100のため最大ケースは232792560 = 16*9*5*7*11*13*17*19となる。多分。オーバーフローはしないはず#include <iostream>#include <vector>#include <map>#include "assert.h"#include <fstream>#include <cstdlib>#include <ctime>#include <sstream>using namespace std;#define MAX_N 100#define MAX_K 1000long long gcd(long long a, long long b){if(b==0) return a;return gcd(b, a%b);}long long lcm(long long a, long long b){if(a<b) swap(a,b);if(b==1) return a;return a* (b/gcd(a,b));}int dfs(vector< vector<int> > &G, vector<bool> &visit, int pos){visit[pos] = true;int res = 1;for(int i=0; i<G[pos].size(); i++){if(visit[ G[pos][i] ] == true) continue;res += dfs(G, visit, G[pos][i]);}return res;}int solve_dfs(const vector<int> &v){int n=v.size();vector<vector<int> > G(n);for(int i=0; i<n; i++){G[i].push_back( v[i] );G[ v[i] ].push_back( i );}vector<bool> visit(n,false);int ans = 1;for(int i=0; i<n; i++){if(visit[i] == true) continue;ans = lcm(ans, dfs(G, visit, i));}return ans;}int main(){int N;cin >> N;assert(2<=N && N<=MAX_N);int K;cin >> K;assert(0<=K && K<=MAX_K);vector<int> v(N);for(int i=0; i<N; i++){v[i] = i;}for(int i=0; i<K; i++){int x,y;cin >> x >> y;assert(1<=x && x<= N);assert(1<=y && y<= N);assert(x<y);assert(x+1 == y);x--;y--;swap( v[x], v[y] );}cout << solve_dfs(v) << endl;return 0;}