🍧 μ½”λ”©ν…ŒμŠ€νŠΈ

[μΈν”„λŸ° C++] 27. N!의 ν‘œν˜„λ²•

peewoong 2024. 4. 23. 18:32

✏️ 문제

μž„μ˜μ˜ N에 λŒ€ν•˜μ—¬ N!은 1λΆ€ν„° NκΉŒμ§€μ˜ 곱을 μ˜λ―Έν•œλ‹€.

μ΄λŸ¬ν•œ 큰 수λ₯Ό ν‘œν˜„ν•˜λŠ” λ°©λ²•μœΌλ‘œ μ†Œμˆ˜λ“€μ˜ 곱으둜 ν‘œν˜„ν•˜λŠ” 방법이 μžˆλ‹€.

예λ₯Όλ“€μ–΄ 825 = 0 1 2 0 1 둜 ν‘œν˜„κ°€λŠ₯ν•œλ°, μ΄λŠ” 2λŠ” μ—†κ³ , 3은 1번, 5λŠ” 2번, 7은 μ—†κ³ , 11은 1번의 κ³±μ΄λΌλŠ” μ˜λ―Έμ΄λ‹€. 

이와 같이 λ³€ν™˜ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•΄λ³΄μž.

 

🍧 μž…λ ₯

5

 

🎭 좜λ ₯

5! = 3 1 1

 

✨ 1트 (κ°•μ˜ 풀이)

μ†Œμˆ˜λ₯Ό λ°°μ—΄λ‘œ λ§Œλ“€μ§€, λ§Œλ“ λ‹€λ©΄ μž…λ ₯된 nκΉŒμ§€μ˜ μ†Œμˆ˜μ˜ 갯수만큼 λ§Œλ“€μ–΄μ•Όν• μ§€? 또 κ·Έλ ‡λ‹€λ©΄, κ·Έ 만큼 μ†Œμˆ˜νŒλ³„κΈ°λ₯Ό κ΅΄λ €μ„œ ν•΄μ•Όν•˜λŠ”λ° 이게 νš¨μœ¨μ μ΄μ§€ μ•Šμ€ 것 κ°™μŒ. nκΉŒμ§€μ˜ λͺ¨λ“ μˆ˜λ₯Ό λ°°μ—΄λ‘œ λ§Œλ“œλŠ” 것 κ°™μ§„ μ•ŠμŒ. μ†Œμˆ˜λ§Œ μΉ΄μš΄νŒ…ν•΄μ•Όν•˜λ‹ˆκΉŒ. μ–΄λ–»κ²Œ ν’€μ–΄μ•Όν• μ§€ νŒλ‹¨μ΄ μ•ˆμ„œμ„œ κ°•μ˜ν’€μ΄λ₯Ό 보기둜 ν•˜μ˜€λ‹€.

κ°•μ˜ν’€μ΄ πŸ‘‰ 배열을 λ§Œλ“œλŠ” 것 맞음. nκΉŒμ§€μ˜ κ°’λ“€ λͺ¨λ‘. 단, 2λΆ€ν„° μ†ŒμΈμˆ˜λΆ„ν•΄ κ²Έ λ°°μ—΄μ˜ ν•΄λ‹Ή μš”μ†Œμ— ++λ₯Ό ν•΄μ€€λ‹€. λ§Œμ•½, 8κ³Ό 같은 μˆ˜κ°€ μžˆλ‹€λ©΄, 8/2 = 4인데, λ°”λ‘œ 3으둜 λ‚˜λˆ μ£ΌλŠ” 것이 μ•„λ‹ˆλΌ, 2둜 λ‚˜λˆŒ 수 μžˆμ„ λ•ŒκΉŒμ§€ κ³„μ†ν•΄μ„œ λ‚˜λˆ μ€€λ‹€λŠ” 것이 포인트. κ·ΈλŸ¬λ‹€κ°€ 해당값이 1이 될 λ•Œ whileλ¬Έ νƒˆμΆœ

#include <iostream>
#include <vector>
#include<algorithm>
using namespace std;

int main(void){
	//freopen("input.txt", "rt", stdin);
	
	int n, tmp, j;
	cin >> n;
	vector<int> a(n+1);
	
	for(int i = 2; i <= n; ++i){
		tmp = i;
		j = 2;
		
		while(true){
			if(tmp % j == 0){
				tmp = tmp / j;
				a[j]++;
			}
			else{
				j++;
			}
			
			if(tmp == 1) break;
		}
	}
	
	cout << n << "! = ";
	for(int i = 2; i <=n; ++i){
		if(a[i] != 0){
			cout << a[i] << ' ';
		}
	}
	 
	
	return 0;
}