結果

問題 No.443 GCD of Permutation
ユーザー startcppstartcpp
提出日時 2016-11-12 20:00:43
言語 C++11
(gcc 11.4.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
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 1 ms
5,248 KB
testcase_01 AC 1 ms
5,248 KB
testcase_02 AC 2 ms
5,248 KB
testcase_03 AC 1 ms
5,248 KB
testcase_04 AC 1 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 1 ms
5,248 KB
testcase_09 AC 1 ms
5,248 KB
testcase_10 AC 2 ms
5,248 KB
testcase_11 AC 1 ms
5,248 KB
testcase_12 AC 1 ms
5,248 KB
testcase_13 AC 2 ms
5,248 KB
testcase_14 AC 2 ms
5,248 KB
testcase_15 AC 2 ms
5,248 KB
testcase_16 AC 2 ms
5,248 KB
testcase_17 AC 1 ms
5,248 KB
testcase_18 AC 2 ms
5,248 KB
testcase_19 AC 2 ms
5,248 KB
testcase_20 AC 2 ms
5,248 KB
testcase_21 AC 2 ms
5,248 KB
testcase_22 AC 1 ms
5,248 KB
testcase_23 AC 2 ms
5,248 KB
testcase_24 AC 1 ms
5,248 KB
testcase_25 AC 2 ms
5,248 KB
testcase_26 AC 2 ms
5,248 KB
testcase_27 AC 2 ms
5,248 KB
testcase_28 AC 2 ms
5,248 KB
testcase_29 AC 2 ms
5,248 KB
testcase_30 AC 1 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);
}

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;
}
0