0의 경우 곱해도 0이다. 즉 0은 미리 버려도 된다.
0을 제거하고 남은 수 중에 너무 높은 자리는 낮은 자리에 영향을 줄 수 없다고 생각하고 잘라내면 된다.
#include <iostream>
using namespace std;
typedef unsigned long long ull;
int main()
{
ios::sync_with_stdio(0), cin.tie(0);
ull ret = 1, N;
cin >> N;
for (int i = 2; i <= N; ++i)
{
ret *= i;
while (!(ret % 10))
ret /= 10;
ret %= 10000000000000;
}
ret %= 10;
cout << ret;
}
10으로 나머지 연산한 값으로 해결해 보려 했지만 일의 자리 범위 밖에서의 값이 나중에 곱을 통해 더해지면서 영향을 줄 수 있기에 안되는 것 같다.
16하고 6의 경우 5를 곱하면 80, 30이다
이런 경우가 존재할 수 있기에 충분히 큰 수를 남겨주면서 이어줘야 한다.