結果
| 問題 | No.443 GCD of Permutation | 
| コンテスト | |
| ユーザー |  startcpp | 
| 提出日時 | 2016-11-12 20:00:43 | 
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) | 
| 結果 | 
                                AC
                                 
                             | 
| 実行時間 | 2 ms / 1,000 ms | 
| コード長 | 1,727 bytes | 
| コンパイル時間 | 635 ms | 
| コンパイル使用メモリ | 67,116 KB | 
| 実行使用メモリ | 5,248 KB | 
| 最終ジャッジ日時 | 2024-10-13 23:51:41 | 
| 合計ジャッジ時間 | 1,387 ms | 
| ジャッジサーバーID (参考情報) | judge5 / judge4 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 4 | 
| other | AC * 28 | 
ソースコード
//下2桁の交換に注目した筋肉解法です。
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
using namespace std;
string s;
vector<int> val;				//sに使われている記号(0~9)の集合
int gcd(int a, int b) {
	if (b == 0) return a;
	return gcd(b, a % b);
}
int lcm(int a, int b) {
	return a * b / gcd(a, b);
}
bool check(int n) {
	int i;
	int tmp;
	
	if (n == 1) return true;
	if (n == 2 || n == 4 || n == 5 || n == 8) {
		for (i = 0; i < val.size(); i++) if (val[i] % n != 0) return false;
		return true;
	}
	if (n == 7) {
		if (val.size() != 2) { return false; }
		
		//mod7
		tmp = 0;
		for (i = 0; i < s.length(); i++) {
			tmp *= 10;
			tmp += (s[i] - '0');
			tmp %= 7;
		}
		if (tmp % 7 != 0) return false;
		
		//value
		for (i = 0; i < 3; i++) if (val[0] == i && val[1] == 7 + i) return true;
		return false;
	}
	if (n % 3 == 0) {
		tmp = 0;
		for (i = 0; i < s.size(); i++) tmp += s[i] - '0';
		if (n == 3 || n == 9 || n == 27 || n == 81) return (tmp % n == 0);
		if (n % 9 != 0) return (tmp % 3 == 0) && check(n / 3);
		if (n % 27 != 0) return (tmp % 9 == 0) && check(n / 9);
		if (n == 54) return check(27) && check(2);
	}
	return false;
}
int main() {
	int i;
	
	cin >> s;
	
	for (i = 0; i < s.length(); i++) val.push_back(s[i] - '0');
	sort(val.begin(), val.end());
	val.erase(unique(val.begin(), val.end()), val.end());
	
	if (val.size() == 1) { cout << s << endl; return 0; }
	
	int a = 9;
	for (i = 0; i < val.size() - 1; i++) a = min(a, val[i + 1] - val[i]);
	
	//答えは9a以下
	for (i = 9 * a; i >= 1; i--) {
		if (lcm(9, i) > 9 * a) {
			continue;
		}
		if (check(i)) {	//全部iの倍数になるか?
			break;
		}
	}
	cout << i << endl;
	return 0;
}
            
            
            
        