結果
| 問題 | No.443 GCD of Permutation | 
| コンテスト | |
| ユーザー |  startcpp | 
| 提出日時 | 2016-11-12 18:53:36 | 
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) | 
| 結果 | 
                                WA
                                 
                             | 
| 実行時間 | - | 
| コード長 | 1,450 bytes | 
| コンパイル時間 | 856 ms | 
| コンパイル使用メモリ | 66,628 KB | 
| 実行使用メモリ | 5,248 KB | 
| 最終ジャッジ日時 | 2024-11-25 21:22:05 | 
| 合計ジャッジ時間 | 1,639 ms | 
| ジャッジサーバーID (参考情報) | judge2 / judge3 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 4 | 
| other | AC * 23 WA * 5 | 
ソースコード
//下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 == 7 || n == 8) {
		for (i = 0; i < val.size(); i++) if (val[i] % n != 0) return false;
		return true;
	}
	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;
}
            
            
            
        