n = int(input())
p=int(1e6)+3
mod=int(1e6)
def res(v):
return (v[0] % p, v[1] % p)
def square(v):
a=v[0]
b=v[1]
return res((a**2 + 5*(b**2), 2*a*b))
def mul(v1,v2):
a=v1[0]
b=v1[1]
c=v2[0]
d=v2[1]
return res((a*c + 5*b*d, a*d + b*c))
def pow(v, n):
curr=v
first=True
while(n):
if n&1!=0:
if first:
ret=curr
ret=res(ret)
first=False
else:
ret=mul(ret,curr)
ret=res(ret)
n>>=1
curr=square(curr)
curr=res(curr)
return ret
def mypow2(n):
curr=2
ret=1
while(n):
if n&1!=0:
ret*=curr
ret%=p
n>>=1
curr*=curr
curr%=p
return ret
v = pow((1,+1), n)[1]
v *= 2
v %= p
v *= mypow2(n*(p-2))
v %= p
print(v%mod)
피보나치 공식에서 어차피 (1+-root5)^n의 무리수 부분의 계수 절대값이 서로 같길래
걍 그부분에 두배씌워주고, 또 2^n으로 나눠줘야하는데 너무 커서
합동식 역원으로 조져주고 했음.
근데 답이 작은 n에서는 성립하는데 큰 n에서는 안되어요.
프린이에게 도움을 주세오... ㅜㅜ
아 글에 잘못 썼는데 너무 커서가 아니라 나눗셈연산이라서임... 프잘알 행님들은 찰떡같이 알아들으시리라 믿음ㅎ
실수 연산을 쓰면 정확도에 한계가 있어서 그럼
예를 들어서 int(1e30) 해보셈 그러면 알거임
먼저 답변 감사합니다. 원래 문제는 백준 2749이고, 저는 모듈로로 떡칠을 해서(1e6+3) 오버플로는 없었을거 같아요
이거 1000003으로 나눈 나머지를 구한 다음에 그걸 다시 1000000로 나누는거잖아 당연히 답이 안나옴
헉 안되나요?! 왠지 될거 같았는데 안되는 거였네요... 답변 감사합니다 덕분에 삽질 그만해야겠어요 ㅜㅜ
꺼무위키에 힌트 있더라 나는 그거 보고 아이디어 얻음
아마 피사노 주기나 행렬일텐데, 저는 좀 색다르게 풀고 싶었어요오