파이썬 배우기 열다섯째날---간단한 정수론

모듈로 연산

여기에 이미지 설명 삽입
(a b)mod m=(a mod m) (b mod m) mod m

1. 질문 통계

여기에 이미지 설명 삽입

a,b,n=map(int,input().split())
res=a*5+b*2
m=n//res*7
n=n%res
t=0
while n>0:
    if t<5:
        n-=a
        m+=1
    else:
        n-=b
        m+=1
print(m)

둘, 빠른 전력

여기에 이미지 설명 삽입

여기에 이미지 설명 삽입
여기에 이미지 설명 삽입

b,p,k=map(int,input().split())
def quick_mi(b,p,k):
  n=p
  b%=k
  ans=1
  while n:
    if n&1==1:
      ans=(ans*b)%k
    b=(b*b)%k
    n>>=1
  return ans

print(quick_mi(b,p,k))

3. RSA 복호화

여기에 이미지 설명 삽입
먼저 다음 코드를 사용하여 p, q를 해결합니다.

import math
n=1001733993063167141
k=int(math.sqrt(n))
for i in range(2,k+1):
    if n%i==0:
        print(i,n//i)
891234941 1123984201

두 번째 단계는 de%((p-1)(q-1))의 공식을 변환하는 것입니다.

n=1001733993063167141
d=212353
p=891234941
q=1123984201
tmp=(p-1)*(q-1)
print(tmp)
for i in range(2,n+1):
    now=i*tmp+1
    if now%d==0:
        print(now//d)
        break
1001733991047948000
823816093931522017

세 번째 단계는 빠른 전력 코드를 사용하여 x=c^e mod n을 해결하는 것입니다.

n=1001733993063167141
e=823816093931522017
c=20190324
def fastpow(a,b,mod):
    ans=1
    while b:
        if b&1:
            ans=ans*a%mod
        a=a*a%mod
        b>>=1
    return ans
print(fastpow(c,e,n))
579706994112328949

GCD

여기에 이미지 설명 삽입

def gcd(a,b):
    if b==0:
        return a
    return gcd(b,a%b)

def gcd(a,b):
    return a if b==0 else gcd(b,a%b)

from math import gcd

LCM

최소 공배수
LCM=a*b/gcd(a,b)
여기에 이미지 설명 삽입

def lcm(a,b):
	return a*b//gcd(a,b)

4. 호두의 개수(최소공배수)

여기에 이미지 설명 삽입
이 문제는 a, b, c의 최소 공배수를 찾는 것입니다.

from math import *

def lcm(a,b):
    return a*b//gcd(a,b)

a,b,c=map(int,input().split())
ans=lcm(lcm(a,b),c)
print(ans)

다섯, 행크슨의 재미있는 질문들

여기에 이미지 설명 삽입
80% 통과, 마지막 시간 초과, ac의 파이썬 코드를 찾지 못했습니다. 있는 경우 댓글 그룹에 게시하세요!

import math
from math import gcd

def lcm(a,b):
    return a*b//gcd(a,b)

n=int(input())
for i in range(n):
    a0,a1,b0,b1=map(int,input().split())
    ans=0
    for x in range(1,int(math.sqrt(b1)+1)):
        if b1%x==0:
            if gcd(x,a0)==a1 and lcm(x,b0)==b1:
                ans+=1
            y=b1//x
            if x==y:continue
            if gcd(y,a0)==a1 and lcm(y,b0)==b1:
                ans+=1
    print(ans)

6. 정수 찾기

여기에 이미지 설명 삽입

여기에 이미지 설명 삽입
여기에 이미지 설명 삽입
예전에 다른 분들의 글쓰기 방식이 패턴을 찾는 걸 봤는데 굉장히 복잡하게 느껴졌는데 항상 최소공배수를 찾는 것 같은 느낌이 들어서 누적 스텝 사이즈가 굉장히 영리했어요!

from math import *
mod=[0,0,1,2,1,4,5,4,1,2,9,0,5,10,11,14,9,0,11,18,9,11,11,15,17,9,23,20,25,16,29,27,25,11,17,4,29,22,37,23,9,1,11,11,33,29,15,5,41,46]
ans=2+mod[2]
k=2
for i in range(3,50):
    while True:
        if ans%i==mod[i]:
            k=lcm(k,int(i))
            break
        else:ans+=k#一直加他们的最小公倍数,一直到满足符合是其倍数
print(ans)
print(2022040920220409)

소수

여기에 이미지 설명 삽입
여기에 이미지 설명 삽입

7. 바보 같은 아이

여기에 이미지 설명 삽입

import math
def check(u):
    if u<=1:
        return False
    for i in range(2,int(math.sqrt(u))+1):
        if u%i==0:
            return False
    return True

letter=[0]*26
s=input()
for i in range(len(s)):
    if "A"<=s[i]<"Z":
        letter[ord(s[i]) - ord('A')] += 1
    else:letter[ord(s[i])-ord('a')]+=1
letter.sort()
maxx=letter[-1]
for i in letter:
    if i==0:
        continue
    minn=i
    break
# print(maxx,minn)
if check(maxx-minn):
    print("Lucky Word")
    print(maxx-minn)
else:
    print("No Answer")
    print("0")

8. 소수

여기에 이미지 설명 삽입

N=10**6
primes=[]
bprime=[False]*N

def getPrimes(n):
    global primes
    global cnt
    bprime[0]=True
    bprime[1]=True
    for i in range(2,n+1):
        if not bprime[i]:
            primes.append(i)
            cnt+=1
            for j in range(i*2,n+1,i):
                bprime[j]=True

n=int(input())
cnt=0
getPrimes(n-1)

for p in primes:
    print(p,end=' ')
print()
print(cnt)

9. 소인수 분해

여기에 이미지 설명 삽입

추천

출처blog.csdn.net/qq_51408826/article/details/129973775