Language Grammar/C++

2024 - 06 - 04 C++ 코딩테스트 10주완성 D+13

Jang_^ 2024. 6. 4. 18:15

1 - 백준 4375 문제

 

시작하기에 앞서 이 문제의 핵심은 모듈러 분배 법칙에 있다.

(A * B + C * D) % F = ((A * B) % F + (C * D) % F) % F

 

라는 공식이다. 이를 이용하여 시간복잡도를 짧게 만들 수 있다.

 

 

2와 5로 나누어 떨어지지 않는 자연수 n을 입력받아

 

각 자리수가 1인수의 자릿수를 출력하는 문제

 

입력받은 10의 자리수를 올려서 더해줄 임의의 변수 cnt와

 

자릿수를 카운트해줄 ret를 이용하여

 

먼저 cnt = 1 와 ret = 1 으로 초깃값을 정해준 다음에 

 

cnt = (10 * cnt ) + 1 라는 증감식을 써준다.

 

위에 식을 계산하면 1, 10 + 1 , 110 + 1 , 1110 + 1 으로 전부 각 자리수가 1인 1 , 11, 111, 1111 ... 등의 숫자가 나오게 된다.

 

그리고 더하여 줄때마다 자릿수를 더하여 주어야하기 때문에 ret++ 를 추가한다.

 

cnt 를 처음 입력받은 자연수로 나누었을 때, 나머지가 0이 되면 배수인것이다.

 

따라서 나머지가 0이 될때 자릿수인 ret을 출력시켜주면 된다.

 

그리고 모듈러 법칙에서  ret  % a  를 해주어도 다시 %a를 나누었을 때 나머지 값은 똑같으므로 나누어 준다.

 

#include <bits/stdc++.h>

using namespace std;

long long a;

int main()
{

	while (cin >> a && a != EOF)
	{
		long long cnt = 1, ret = 1;
		while (true)
		{				
			if (ret % a == 0)
			{
				cout << cnt << endl;
				break;
			}
			
			else
			{
				ret = ret * 10 + 1;
				ret %= a;
				cnt++;
			}
			
		}
	}
	return 0;
}