λ°±μ€ 1630
λ¬Έμ
μ€λ―Όμ μ±κ³΅
μ€λ―Όμμ λ§μ‘±νλ μ: 1λ³΄λ€ ν¬κ±°λ κ°κ³ , Nλ³΄λ€ μκ±°λ κ°μ λͺ¨λ μμ°μλ‘ λλμ΄ λ¨μ΄μ§λ μ.
μμμ΄μ λ€μμ΄λ Nμ΄ μ£Όμ΄μ‘μ λ, μ€λ―Όμμ λ§μ‘±νλ κ°μ₯ μμ μκ° κΆκΈν΄μ‘λ€. κ·Έ μλ₯Ό ꡬνλ νλ‘κ·Έλ¨μ μμ±νμμ€.
μ λ ₯
첫째 μ€μ μμ°μ Nμ΄ μ£Όμ΄μ§λ€. Nμ 1,000,000λ³΄λ€ μκ±°λ κ°μ μμ°μμ΄λ€.
μΆλ ₯
첫째 μ€μ μ£Όμ΄μ§ μ λ ₯μ λν΄ μ€λ―Όμμ λ§μ‘±νλ κ°μ₯ μμ μμ°μλ₯Ό 987654321λ‘ λλ λλ¨Έμ§λ₯Ό μΆλ ₯νλ€.
νμ΄
1 λΆν° μ°μλλ μ¦κ°νλ μ μλ€μ κ³±μ μμ μ΅μ곡배μκ° μκΈ°λ κ·μΉμ μ°ΎμΌλ©΄ λ¬Έμ κ° νλ¦°λ€.
λͺ¨λ μλ 1λ‘ λλμ΄ λ¨μ΄μ§λ―λ‘ 1μ μ μΈνκ³ , 2λΆν° μ°μν΄μ λμ΄ν΄λ³΄λ©΄
2, 3, 2^2, 5, 2 * 3, 7, 2^3, 3^2 μ κ°μ΄ λνλΌ μ μλ€.
μμλλ‘ κ³±ν΄κ°λ©΄μ μ΅μ곡배μλ₯Ό νμΈνλ©΄ μ°μ μ μΌλ‘
1. lcm(a, b) = (a * b) % gcd(a, b) μ΄λ€. a, bκ° μλ‘μμ΄λ©΄ gcd(a, b)λ 1μ΄κ³ , a, bμ€ νλκ° μμλΌλ©΄ νμ μλ‘μμ΄λ―λ‘
a, b λμ€ νλκ° μμλΌλ©΄ lcm(a, b) = a * bμ΄λ€. λΌλ κ²μ μ μ μλ€.
2. lcm(a, b) = (a * b) % gcd(a, b)λ₯Ό λ€μ κΈ°μ΅ν΄μ, μμμ NμΉμ ν΄λΉνλ μμ°μκ° λμ€λ©΄ lcm κ³μ° κ³Όμ μμ νμ gcdλ‘ mod μ°μ°μ ν΄μ£ΌμκΈ° λλ¬Έμ νΉμ μμμ N - 1μΉ κΉμ§λ§ μ΅μ곡배μκ° λ§μ‘±νκ³ μλ€λ μ¬μ€ μ μμμλ€.
μλ₯Ό λ€μ΄, 1 λΆν° 7 κΉμ§ κ³±νμλ μ΄μ μ κ³μ° κ³Όμ μ λ°λΌ 2^2 * 3 * 5 * 7 μ΄λΌλ κ²μ μ μ μλ€. 8μ 2^3μ΄κ³ , lcmμμ 2κ° νλ λΆμ‘±νλ€λ κ²μ μ μ μλ€.
κ·Έλ¬λ―λ‘ λκ°μ§ 쑰건μ λ§μ‘±νκ² κ΅¬ννλ©΄ λλ€.
#include <iostream>
#include <vector>
#define ll long long
using namespace std;
int isPrime[1000001], isTime[1000001];
vector<int>priArr;
void pcheck() {
for(int i=2; i <= 1000000; i++) isPrime[i] = i;
for(int i=2; i*i <=1000000; i++) {
if(!isPrime[i]) continue;
for(int j = i*i; j<=1000000; j += i) isPrime[j] = 0;
}
for(int i=2; i<=1000000; i++)
if(isPrime[i]) priArr.push_back(i);
}
int main() {
ll a = 1, N;
cin>>N;
pcheck();
for(auto e : priArr) {
long long check = e;
while(check * e <= 1000000){
check = check * e;
isTime[check] = e;
}
}
for(int i=1; i<=N; i++){
if(isPrime[i])
a = (a*i)%987654321;
else {
if(isTime[i])
a = (a*isTime[i])%987654321;
}
}
cout<<a;
}