結果

問題 No.443 GCD of Permutation
ユーザー startcppstartcpp
提出日時 2016-11-12 19:30:16
言語 C++11
(gcc 11.4.0)
結果
WA  
実行時間 -
コード長 1,872 bytes
コンパイル時間 744 ms
コンパイル使用メモリ 67,220 KB
実行使用メモリ 5,248 KB
最終ジャッジ日時 2024-11-25 21:28:00
合計ジャッジ時間 1,569 ms
ジャッジサーバーID
(参考情報)
judge1 / judge3
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 1 ms
5,248 KB
testcase_01 AC 2 ms
5,248 KB
testcase_02 AC 1 ms
5,248 KB
testcase_03 AC 1 ms
5,248 KB
testcase_04 AC 2 ms
5,248 KB
testcase_05 AC 1 ms
5,248 KB
testcase_06 AC 1 ms
5,248 KB
testcase_07 AC 1 ms
5,248 KB
testcase_08 AC 2 ms
5,248 KB
testcase_09 AC 2 ms
5,248 KB
testcase_10 AC 1 ms
5,248 KB
testcase_11 WA -
testcase_12 AC 1 ms
5,248 KB
testcase_13 AC 2 ms
5,248 KB
testcase_14 AC 1 ms
5,248 KB
testcase_15 AC 2 ms
5,248 KB
testcase_16 AC 2 ms
5,248 KB
testcase_17 AC 2 ms
5,248 KB
testcase_18 AC 1 ms
5,248 KB
testcase_19 AC 1 ms
5,248 KB
testcase_20 AC 2 ms
5,248 KB
testcase_21 AC 1 ms
5,248 KB
testcase_22 WA -
testcase_23 AC 1 ms
5,248 KB
testcase_24 WA -
testcase_25 AC 2 ms
5,248 KB
testcase_26 WA -
testcase_27 WA -
testcase_28 AC 2 ms
5,248 KB
testcase_29 AC 2 ms
5,248 KB
testcase_30 AC 2 ms
5,248 KB
testcase_31 AC 2 ms
5,248 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

//下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);
}

//sをnで割ったときの商を返す.
vector<int> div(int n) {
	int i;
	int val = 0;
	vector<int> ret;
	
	for (i = 0; i < s.length(); i++) {
		val *= 10;
		val += (s[i] - '0');
		ret.push_back(val / n);
		val %= n;
	}
	return ret;
}

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) return (tmp % n == 0);
		if (n == 27 || n == 81) {
			if (tmp % 9 != 0) return false;
			//sをn / 9でわる
			vector<int> t = div(n / 9);
			//9の倍数判定
			tmp = 0;
			for (i = 0; i < t.size(); i++) { tmp += t[i]; }
			return (tmp % 9 == 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;
}
0