[์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œํ’€์ด] ZIMBABWE

2021. 11. 27. 12:36ใ†Programming/Algorithms

 

 

1. ๋ฌธ์ œ

 

 

๊ณ„๋ž€ ํ•œ ๊ฐœ์— _ _ _ _ _ _ _ _ _ _ _ _ _ ์›จ๋ธŒ๋ฐ”์ง ๋‹ฌ๋Ÿฌ!

 

 

๊ณ„ํš ๊ฒฝ์ œ์˜ ์‹คํŒจ๋กœ ์„ธ๊ณ„ ์ตœ๊ณ ์˜ ์ธํ”Œ๋ ˆ์ด์…˜์„ ์ž๋ž‘ํ•˜๊ฒŒ ๋œ ๊ณต์‚ฐ ๊ตญ๊ฐ€ ์›จ๋ธŒ๋ฐ”์ง์—์„œ๋Š” ํ•˜๋ฃจ ์ค‘์—๋„ ๋ฌผ๊ฐ€๊ฐ€ ๊ณ„์† ์˜ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๋ฌผ๊ฑด์˜ ๊ฐ€๊ฒฉ์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ”๊ฟ”์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์›จ๋ธŒ๋ฐ”์ง์—์„œ ๊ฐ€์žฅ ํฐ ๋ฌด๊ฐ€๋ฒ  ๋งˆํŠธ์—์„œ๋Š” ๊ทธ๋ž˜์„œ ์œ„์™€ ๊ฐ™์ด ๋นˆ ์นธ๋งŒ ์“ฐ์—ฌ ์žˆ๋Š” ๊ด‘๊ณ ํŒ์„ ๋ถ™์—ฌ๋†“๊ณ  ๊ณ„๋ž€ ๊ฐ€๊ฒฉ์ด ์˜ค๋ฆ„์— ๋”ฐ๋ผ (์ •ํ™•ํžˆ๋Š” ์›จ๋ธŒ๋ฐ”์ง ๋‹ฌ๋Ÿฌ์˜ ๊ฐ€์น˜๊ฐ€ ์ถ”๋ฝํ•จ์— ๋”ฐ๋ผ) ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ˆซ์ž๊ฐ€ ํฌ๊ฒŒ ์ ํžŒ ํ”Œ๋ผ์Šคํ‹ฑ ํŒ์„ ๋นˆ ์นธ์— ๊ฐˆ์•„ ๋ผ์›๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๊ณ„๋ž€ ํ•œ ๊ฐœ์— 35์–ต ์›จ๋ธŒ๋ฐ”์ง ๋‹ฌ๋Ÿฌ๋ผ๊ณ  ํ•˜๋ฉด, 3์ด ์“ฐ์ธ ํŒ ํ•œ ๊ฐœ, 5๊ฐ€ ์“ฐ์ธ ํŒ ํ•œ ๊ฐœ, 0์ด ์“ฐ์ธ ํŒ ์—ฌ๋Ÿ ๊ฐœ๋ฅผ ๋นˆ์นธ์— ์ˆœ์„œ๋Œ€๋กœ ๋ผ์šฐ๋Š” ๊ฒƒ์ด์ฃ .

๋ฌด๊ฐ€๋ฒ  ๋งˆํŠธ์—์„œ ์•„๋ฅด๋ฐ”์ดํŠธ๋ฅผ ํ•˜๋Š” ์ข…์šฑ์ด๋Š” ์–ด๋Š ๋‚  ๊ณค๋ž€ํ•œ ์†๋‹˜์„ ๋งž์•˜์Šต๋‹ˆ๋‹ค. ์ด ์†๋‹˜์€ ์•„๊นŒ ์‚ฌ ๊ฐ”๋˜ ๊ณ„๋ž€์„ ํ™˜๋ถˆํ•˜๊ฒ ๋‹ค๊ณ  ๋Œ์•„์™”๋Š”๋ฐ, ์˜์ˆ˜์ฆ์„ ์žƒ์–ด๋ฒ„๋ฆฐ๋ฐ๋‹ค ๊ณ„๋ž€์„ ์–ผ๋งˆ์— ์ƒ€๋Š”์ง€๋ฅผ ๊ธฐ์–ตํ•˜์ง€๋„ ๋ชปํ•œ๋‹ค๊ณ  ํ•˜๋Š”๊ตฐ์š”. ๊ณ„๋ž€ ๊ฐ’์€ ๊ทธ ์‚ฌ์ด ํ•œ ๋ฒˆ ๋˜ ์˜ฌ๋ž๊ธฐ ๋•Œ๋ฌธ์— ๊ด‘๊ณ ํŒ์— ์ ํžŒ ๊ฐ€๊ฒฉ์€ ์ด๋ฏธ ๋ฐ”๋€ ๋’ค์ž…๋‹ˆ๋‹ค. ๋‹คํ–‰ํžˆ ์ข…์šฑ์ด๋Š” ๋‘ ๊ฐ€์ง€๋ฅผ ๊ธฐ์–ตํ•ฉ๋‹ˆ๋‹ค.

 

  • ๋งˆ์ง€๋ง‰์— ๊ณ„๋ž€ ๊ฐ€๊ฒฉ์ด ์˜ฌ๋ž์„ ๋•Œ, ์ข…์šฑ์ด๋Š” ๊ด‘๊ณ ํŒ์— ๊ฝ‚ํžŒ ํ”Œ๋ผ์Šคํ‹ฑ ํŒ์˜ ์ˆœ์„œ๋งŒ ๋ฐ”๊ฟจ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ”Œ๋ผ์Šคํ‹ฑ ํŒ์„ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ์žˆ๋˜ ํ”Œ๋ผ์Šคํ‹ฑ ํŒ์„ ๋บ„ ์ผ์€ ์—†์—ˆ๋‹ค๋Š” ๊ฒƒ์ด์ฃ .
  • ๋งˆ์ง€๋ง‰ ๊ณ„๋ž€ ๊ฐ€๊ฒฉ์„ ๋ณด๋ฉด์„œ '์™€ ์ด๊ฑฐ๋ฉด ์ •ํ™•ํžˆ ์‚ฌํƒ• m๊ฐœ๋ฅผ ์‚ด ์ˆ˜ ์žˆ๊ตฌ๋‚˜' ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋งˆ์ง€๋ง‰ ๊ณ„๋ž€ ๊ฐ€๊ฒฉ์€ m์˜ ๋ฐฐ์ˆ˜์˜€์Šต๋‹ˆ๋‹ค. (์‚ฌํƒ• ๊ฐ€๊ฒฉ๋„ ์ด๋ฏธ ์˜ฌ๋ž๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฑธ ๊ฐ€์ง€๊ณ  ๊ณ„๋ž€ ๊ฐ€๊ฒฉ์„ ๊ณ„์‚ฐํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค)

์ง€๊ธˆ ๊ณ„๋ž€ ๊ฐ€๊ฒฉ e์™€ m์ด ์ฃผ์–ด์งˆ ๋•Œ ๊ฐ€๋Šฅํ•œ ์ด์ „ ๊ณ„๋ž€ ๊ฐ€๊ฒฉ์ด ๋ช‡ ๊ฐ€์ง€๋‚˜ ์žˆ๋Š”์ง€ ๊ณ„์‚ฐํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์„ธ์š”. ์ด์ „ ๊ณ„๋ž€ ๊ฐ€๊ฒฉ์€ e ๋ณด๋‹ค ํ•ญ์ƒ ์ž‘์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

 

 

 

 

2. ํ’€์ด

 

2-1. ๋‹จ์ˆœ ํ•ด๋‹ต

 

// ์›จ๋ฐ”๋ธŒ์ง ๋ฌธ์ œ์˜ ๋‹ต์„ ๋ชจ๋‘ ์ฐพ๋Š” ์™„์ „ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜

string e;
string digits;
int n;
int m;

void generate(string price, bool taken[15]) {
	if (price.size() == n) {
		if (price < e) {
			cout << price << endl;
		}
		return;
	}

	for (int i = 0; i < n; ++i) {
		if (!taken[i] && (i == 0 || digits[i - 1] != digits[i] || taken[i - 1])) {
			taken[i] = true;
			generate(price + digits[i], taken);
			taken[i] = false;
		}
	}
}



// ์›จ๋ฐ”๋ธŒ์ง ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋™์  ๊ณ„ํš๋ฒ• ์•Œ๊ณ ๋ฆฌ์ฆ˜ 

const int MOD = 1000000007;
string e;
string digits;
int n;
int m;
int cache[1 << 14][20][2];

int price(int index, int taken, int mod, int less) {
	if (index == n) {
		return (less && mod == 0) ? 1 : 0;
	}

	int& ret = cache[taken][mod][less];
	if (ret != -1) {
		return ret;
	}

	ret = 0;
	for (int next = 0; next < n; ++next) {
		if ((taken & (1 << next)) == 0) {
			if (!less && e[index] < digits[next]) {
				continue;
			}
			if (next > 0 && digits[next - 1] == digits[next] && (taken & (1 << (next - 1))) == 0) {
				continue;
			}
			int nextTaken = taken | (1 << next);
			int nextMod = (mod * 10 + digits[next] - '0') % m;
			int nextLess = less || e[index] > digits[next];
			ret += price(index + 1, nextTaken, nextMod, nextLess);
			ret %= MOD;
		}
	}
	return ret;
}

 

 

 

 

2-2. ๋ฌธ์ œ ํ’€์ด

 

// ์›จ๋ฐ”๋ธŒ์ง ๊ณ„๋ž€ ๊ฐ€๊ฒฉ์„ ์ฐพ์•„๋ณด์ž!



/* ์›จ๋ฐ”๋ธŒ์ง ๋ฌธ์ œ์˜ ๋‹ต์„ ๋ชจ๋‘ ์ฐพ๋Š” ์™„์ „ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜


์ด์ „ ๊ณ„๋ž€ ๊ฐ€๊ฒฉ์€ ๋‹ค์Œ ์„ธ๊ฐ€์ง€ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•ด์•ผ ํ•œ๋‹ค. 

1. ์ƒˆ ๊ณ„๋ž€ ๊ฐ๊ฒฉ e์— ํฌํ•จ๋œ ์ˆซ์ž๋“ค์„ ์žฌ๋ฐฐ์—ดํ•œ ๊ฒฐ๊ณผ
2. ์ƒˆ ๊ณ„๋ž€ ๊ฐ€๊ฒฉ e๋ณด๋‹ค ์ž‘์•„์•ผ ํ•œ๋‹ค.
3. m์œผ๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ ธ์•ผ ํ•œ๋‹ค. 




	[์‚ฌ์šฉํ•  ๋ฌธ์ œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•]

e์˜ ๊ฐ ์ž๋ฆฟ์ˆ˜๋ฅผ ์ •๋ ฌํ•ด์„œ digits์— ์ €์žฅํ•œ ๋‹ค์Œ
์ด๋ฒˆ์— ์‚ฌ์šฉํ•  ์ž๋ฆฟ์ˆ˜ ๋ฐ”๋กœ ์•ž ์ž๋ฆฌ๊ฐ€,

1. ์—†๊ฑฐ๋‚˜ (i = 0)
2. ์ด๋ฒˆ ์ž๋ฆฟ์ˆ˜๋ž‘ ๋‹ค๋ฅด๊ฑฐ๋‚˜ (digits[i - 1] != digits[i])
3. ์ด๋ฏธ ์‚ฌ์šฉ๋จ (taken[i - 1] = true)

์œ„์™€ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค. 





- digits : e์˜ ์ž๋ฆฟ์ˆ˜๋“ค์„ ์ •๋ ฌํ•œ ๋ฐฐ์—ด
- price : ์ง€๊ธˆ๊นŒ์ง€ ๋งŒ๋“  ๊ฐ€๊ฒฉ
- taken : ๊ฐ ์ž๋ฆฟ์ˆ˜์˜ ์‚ฌ์šฉ ์—ฌ๋ถ€ (boolean)

+ e๋ฅผ string์œผ๋กœ ์„ ์–ธํ•œ ์ด์œ 
: ์ž๋ฆฟ์ˆ˜ ๋‹จ์œ„๋กœ ์ˆซ์ž๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ฒฝ์šฐ, ๋ฌธ์ž์—ด์ด ํ›จ์”ฌ ๊ฐ„ํŽธํ•˜๋‹ค.

*/




string e;
string digits;
int n;
int m;

void generate(string price, bool taken[15]) {
	if (price.size() == n) {
		if (price < e) { 
			cout << price << endl;
			// ๋‘˜ ๋‹ค ๋ฌธ์ž์—ด์ด์ง€๋งŒ, ์ž๋ฆฟ์ˆ˜๊ฐ€ ๊ฐ™๊ธฐ์— price์™€ e๋ฅผ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋‹ค. wow
		}
		return;
		// ๊ธฐ์ €์‚ฌ๋ก€ : ๊ณ„๋ž€์˜ ๊ฐ€๊ฒฉ์„ ์ฐพ์•˜๋‹ค!
	}

	for (int i = 0; i < n; ++i) {
		if (taken[i] == false 
			&& (i == 0 || digits[i - 1] != digits[i] || taken[i - 1] = true)) 
		{
			taken[i] = true;
			generate(price + digits[i], taken);
			taken[i] = false;
		}
	}
}






/* ์›จ๋ฐ”๋ธŒ์ง ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋™์  ๊ณ„ํš๋ฒ• ์•Œ๊ณ ๋ฆฌ์ฆ˜ 


- ์ž๋ฆฟ์ˆ˜๋ฅผ ์œ„ํ•ด ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ–ˆ์œผ๋‚˜, ์ด๋กœ ์ธํ•˜์—ฌ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์ด ๊นŒ๋‹ค๋กœ์›Œ์กŒ๋‹ค. 
- boolean ๊ฐ’์ธ taken์€ ๋น„ํŠธ๋งˆ์Šคํฌ๋ฅผ ํ†ตํ•˜์—ฌ ์ •์ˆ˜๋กœ ๋ณ€ํ™˜ ๊ฐ€๋Šฅํ•˜๋‹ค. 
- but, ๋ฌธ์ž์—ด price๋ฅผ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ํ•˜๋Š” ๊ฒƒ์€ ๊นŒ๋‹ค๋กญ๋‹ค. 
: ๊ฐ™์€ price๋ฅผ ๋‘ ๋ฒˆ ๋งŒ๋“ค ์ผ์€ ์—†๊ธฐ ๋•Œ๋ฌธ์— price๋ฅผ ๊ทธ๋Œ€๋กœ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์— ์‚ฌ์šฉํ•˜๋ฉด
์ค‘๋ณต๋˜๋Š” ๋ถ€๋ถ„ ๋ฌธ์ œ๊ฐ€ ํ•˜๋‚˜๋„ ์—†์Œ.


- ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ํ•ด๋‹น ์ž‘์—…์„ ํ•˜๋Š” ์ตœ์†Œํ•œ์˜ ์ •๋ณด๋งŒ ์žฌ๊ท€ ํ˜ธ์ถœ์— ์ „๋‹ฌ!
: ๊ทธ๋ž˜์•ผ ์ค‘๋ณต ๋ฌธ์ œ๊ฐ€ ๋งŽ์ด ์ƒ๊ฒจ์„œ, ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ๊นŒ. 

	[์ง€๊ธˆ๊นŒ์ง€ ๋งŒ๋“  ๊ฐ€๊ฒฉ์ธ price๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๋ถ€๋ถ„]

1. n ์ž๋ฆฌ๋ฅผ ๋ชจ๋‘ ๊ตฌ์„ฑํ–ˆ๋Š”์ง€ ํŒ๋‹จํ•  ๋•Œ
2. ๋‹ค ๋งŒ๋“  ๊ฐ€๊ฒฉ์ด ์‚ฌํƒ• ๊ฐ€๊ฒฉ์˜ ๋ฐฐ์ˆ˜์ธ์ง€ ํŒ๋‹จํ•  ๋•Œ
3. ๋‹ค ๋งŒ๋“  ๊ฐ€๊ฒฉ์ด ๋‚˜์ค‘ ๊ฐ€๊ฒฉ๋ณด๋‹ค ์ž‘์€์ง€ ํ™•์ธํ•  ๋•Œ 


1๋ฒˆ์€ taken์˜ ๋ชจ๋“  ์›์†Œ๊ฐ€ true์ธ์ง€ ํŒ๋ณ„ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋Œ€์ฒด ๊ฐ€๋Šฅ : okay


2๋ฒˆ -> ๊ฐ€๊ฒฉ์ด ์˜ค๋ฅธ ๊ฒƒ์ด ๋งž๋Š”๊ฐ€?

: ์šฐ๋ฆฌ๊ฐ€ ์†์œผ๋กœ ๋‚˜๋ˆ—์…ˆ์„ ํ•˜๋Š” ๊ณผ์ •์„ ์‚ดํŽด๋ณด๋ฉด, 
ex) 7284 ๋Œ€์‹  13284๊ฐ€ 7๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€๋Š” ์ง€ ํ™•์ธํ•˜๋Š” ๊ณผ์ •
๋‚˜๋จธ์ง€๊ฐ€ ๊ฐ™๋‹ค๋ฉด ์•ž์— ์–ด๋–ค ์ˆ˜๊ฐ€ ์™”๋Š”์ง€๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š๋‹ค. 

์ฆ‰, price๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋Œ€์‹ , price๋ฅผ m์œผ๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋ฅผ ์ „๋‹ฌํ•˜์ž. 
: ๋งˆ์ง€๋ง‰์— price๊ฐ€ m์œผ๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€๋Š” ์ง€ ํŒ๋ณ„ํ•˜๋Š” ๋ฐ๋Š” ์ง€์žฅX
: m์œผ๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋Š” 0๋ถ€ํ„ฐ m-1๊นŒ์ง€! ๋”ฐ๋ผ์„œ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๊ฐ€๋Šฅ!


3๋ฒˆ -> ์‚ฌํƒ• ๊ฐ€๊ฒฉ์˜ ๋ฐฐ์ˆ˜๊ฐ€ ๋งž๋Š”๊ฐ€? 

๊ณ„๋ž€์˜ ์ƒˆ ๊ฐ€๊ฒฉ e๊ฐ€ 231 ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž. 
์ด๋•Œ ์ฒซ ์ž๋ฆฌ์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์ˆ˜๋Š” ์ด 3๊ฐœ
1: ์•ž์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋ฐฐ์น˜ํ•˜๋“  ์ด ์ˆ˜๋Š” 231๋ณด๋‹ค ์ž‘์Œ
2: ์•ž์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋ฐฐ์น˜ํ•˜๋Š๋ƒ์— ๋”ฐ๋ผ ์ด ์ˆ˜๋Š” 231๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ์ž‘์Œ
3: ์•ž์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋ฐฐ์น˜ํ•˜๋“  ์ด ์ˆ˜๋Š” 231๋ณด๋‹ค ํผ
: ๋”ฐ๋ผ์„œ 1 OR 2 ์˜ ๊ฒฝ์šฐ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค. (์ด์ „์˜ ๊ณ„๋ž€ ๊ฐ€๊ฒฉ์€ ๋” ์ €๋ ดํ•ด์•ผ ํ•˜๋‹ˆ๊นŒ)

๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ์žฌ๊ท€ ํ˜ธ์ถœ์— 
- price๋Š” ์ด๋ฏธ e๋ณด๋‹ค ์ž‘์œผ๋‹ˆ ๋‚˜๋จธ์ง€๋Š” ์•„๋ฌด๋ ‡๊ฒŒ๋‚˜ ํ•ด๋ผ(1์˜ ๊ฒฝ์šฐ) OR
- price๋Š” e๋ณด๋‹ค ์ปค์งˆ ์ˆ˜ ์žˆ์œผ๋‹ˆ ์ฃผ์˜ํ•ด๋ผ (2์˜ ๊ฒฝ์šฐ)
๋ผ๋Š” ์ •๋ณด๋งŒ ์ „๋‹ฌํ•˜๋ฉด ๋œ๋‹ค. 

์ดํ›„ ๋ชจ๋“  ์ž๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ–ˆ์„ ๋•Œ, price๊ฐ€ e๋ณด๋‹ค ์ž‘์€์ง€ ์•„๋‹Œ์ง€๋ฅผ 
boolean ๊ฐ’ less๋กœ ํ‘œํ˜„ํ•œ๋‹ค. 
- less = true : ์•ž๋ถ€๋ถ„๋ณด๋‹ค ์ž‘์œผ๋ฏ€๋กœ, ํ•ญ์ƒ e๋ณด๋‹ค ์ž‘์€ ์ƒํƒœ
= less = false : price์™€ e์˜ ์•ž๋ถ€๋ถ„์ด ์ผ์น˜ํ•œ๋‹ค. 




- price : ์ง€๊ธˆ๊นŒ์ง€ ๋งŒ๋“  ๊ฐ€๊ฒฉ 
- index : ์ด๋ฒˆ์— ์ฑ„์šธ ์ž๋ฆฌ์˜ ์ธ๋ฑ์Šค
- taken : ์ง€๊ธˆ๊นŒ์ง€ ์‚ฌ์šฉํ•œ ์ž๋ฆฟ์ˆ˜๋“ค์˜ ์ง‘ํ•ฉ
- mod : price์˜ m์— ๋Œ€ํ•œ ๋‚˜๋จธ์ง€
- less : price๊ฐ€ ์ด๋ฏธ e๋ณด๋‹ค ์ž‘์œผ๋ฉด 1, ์•„๋‹ˆ๋ฉด 0 (boolean)


*/



const int MOD = 1000000007;
string e;
string digits;
int n;
int m;
int cache[1 << 14][20][2];

int price(int index, int taken, int mod, int less) {
	if (index == n) {
		if (less == true && mod == 0) {
			return 1;
		}
		else {
			return 0;
		}
	}

	// ๋ฉ”๋ชจ์ด์ œ์ด์…˜
	int& ret = cache[taken][mod][less];
	if (ret != -1) {
		return ret;
	}

	ret = 0;
	for (int next = 0; next < n; ++next) {
		if ((taken == true & (1 << next)) == 0) {
			if (less == false && (e[index] < digits[next])) {
				// ๊ณผ๊ฑฐ ๊ฐ€๊ฒฉ์€ ํ•ญ์ƒ ์ƒˆ๋กœ์šด ๊ฐ€๊ฒฉ๋ณด๋‹ค ์ž‘์•„์•ผ ํ•จ.
				continue;
			}
			if (next > 0 && digits[next - 1] == digits[next] && (taken & (1 << (next - 1))) == 0) {
				// ๊ฐ™์€ ์ˆซ์ž๋Š” ํ•œ ๋ฒˆ๋งŒ ์„ ํƒ
				continue;
			}
			int nextTaken = taken | (1 << next);
			int nextMod = (mod * 10 + digits[next] - '0') % m;
			int nextLess = less || e[index] > digits[next];
			ret += price(index + 1, nextTaken, nextMod, nextLess);
			ret %= MOD;
		}
	}
	return ret;
}





/*


	[๋น„ํŠธ ์—ฐ์‚ฐ์ž ์ •๋ฆฌ]

<< X : X๋งŒํผ ์™ผ์ชฝ์œผ๋กœ ๋น„ํŠธ๋“ค ์ด๋™
>> X : X๋งŒํผ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋น„ํŠธ๋“ค ์ด๋™
~ : ๋น„ํŠธ๋“ค์„ ๋ฐ˜์ „์‹œํ‚จ๋‹ค. (๋‹ค ๋ฐ˜๋Œ€๋กœ, ๋ณด์ˆ˜)
& (AND) : ๋Œ€์‘๋˜๋Š” ๋น„ํŠธ๊ฐ€ ๋ชจ๋‘ 1์ผ ๋•Œ 1์ด๋‹ค.
| (OR) : ๋Œ€์‘๋˜๋Š” ๋น„ํŠธ๊ฐ€ ๋ชจ๋‘ 0์ผ ๋•Œ 0์ด๋‹ค.
^ (XOR) : ๋‘ ๋น„ํŠธ๊ฐ€ ๋‹ฌ๋ผ์•ผ 1์ด๋‹ค. (๋‘˜์ด ๊ฐ™์œผ๋ฉด 0)


*/

 

 

 

 

 

3. ๋Š๋‚€์ 

 

 

 

1. ์–ด๋ ต๋‹ค.

2. ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ๋‹ค๋ฃจ๋Š” ์ƒˆ๋กœ์šด ๊ด€์ 

3. ๋ฌผ๊ฑด์„ ์‚ด ๋•Œ๋Š” ์˜์ˆ˜์ฆ์„ ๊ผญ ์ฑ™๊ธฐ์ž..

 

 

 

 

 

4. git-hub ๋งํฌ

 

- https://github.com/SohyeonKim-dev/AlgorithmicProblem/blob/main/DynamicProgramming_technique/zimbabwe.cpp

 

 

 

 

 

5. ์ถœ์ฒ˜

 

- https://algospot.com/judge/problem/read/ZIMBABWE 

- https://genesis8.tistory.com/130