算法-模板(竞赛必背)

由于这些都非常简单易懂,所以就懒得写注释了

1.求最大公约数和最小公倍数

1.1求最大公约数

# 求最大公约数  GCD

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

print("%d和%d的最大公约数是%d" % (12,3,gcd(12,3)))



1.2求最小公倍数

# 先写出最大公约数函数  GCD

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

print("%d和%d的最大公约数是%d" % (12,3,gcd(12,3)))

# 求最小公倍数  LCM

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

print("%d和%d的最小公倍数是%d" % (7,6,lcm(7,6)))

2.判断素数

2.1判断素数(慢)

from math import *
def is_su(x):
    if x<=1:
        return False
    m=int(sqrt(x)+1)
    for i in range(2,m):
        if x % i == 0:
            return False
    return True

2.2筛选素数

# 筛选素数
# 输出1 ~ N-1的所有素数
# 一个个找速度太慢!!!

from math import *
N=int(1e6)
prime=[0]*N
vis=[0]*N

def check(n):
    for i in range(2,int(sqrt(n)+1)):
        if not vis[i]:
            for j in range(i*i,n+1,i):
                vis[j]=1

    k=0
    for i in range(2,n+1):
        if not vis[i]:
            
            prime[k]=i
            k+=1
    return k

n=int(input())
w=check(n-1)
for i in range(w):
    print(prime[i],end=',')

2.3区间素数

# 区间素数

from math import *

N=int(1e8)

prime=[0]*N
vis=[True]*N
seg=[True]*N

def check(a,b):
    for i in range(2,int(sqrt(b))+1):
        if vis[i]:
            for j in range(i*i,int(sqrt(b)),i):
                vis[j]=False
            for j in range(max(2,(a+i-1)//i),b+1,i):
                seg[j-a]=False
                           
    k=0
    
    for i in range(b-a+1):
        
        if seg[i]:          
            prime[k]=i+a
            k+=1
            
    print(k)

a,b=map(int,input().split())
check(a,b)

3组合数

给定案例:给定  n  组询问,每组询问给定两个整数  a,b ,请你输出  Cbamod(109+7)  的值。输入格式
第一行包含整数  n 。接下来  n  行,每行包含一组  a  和  b 。

输出格式
共  n  行,每行输出一个询问的解。

数据范围
1≤n≤10000 ,
1≤b≤a≤2000 
输入样例:
3
3 1
5 3
2 2
输出样例:
3
10
1

n=int(input())
N=2010
mod=int(1e9)+7
C=[[0]*N for i in range(N)]

for i in range(N):
  for j in range(i+1):
    if not j:
      C[i][j]=1
    else:
      C[i][j]=(C[i-1][j-1]+C[i-1][j]) % mod

for i in range(n):
  a,b=map(int,input().split())
  print(C[a][b])

4图线模板

4.1平面分割

        平面上有 N 条直线,其中第 i 条直线是y=Ai×x+Bi。

        请计算这些直线将平面分成了几个部分?

n=int(input())
line=[tuple(map(int,input().split())) for i in range(n)]
# 去穷,排除重合的直线
se=set(line)
line=list(se)

if line:
    ans=2
    for i in range(1,len(line)): # 1表示从第二条直线开始
        a1,b1=line[i]
        pos=set()

        for j in range(i): # 记录第i条直线与之前的所有直线的交点
            a2,b2=line[j]
            if a1==a2:
                continue
            x=(b2-b1)/(a1-a2)
            y=a1*x+b1
            pos.add((x,y))  # 记录交点坐标
            print(len(pos))
        ans+=len(pos)+1   # 多少个交点,就有多少个+1的平面
print(ans)

4.2点和直线的关系

def cross(x1,y1,x2,y2): #叉积
    return x1*y2-y1*x2
n=int(input())
for i in range(n):
    ax,ay=map(float,input().split())
    bx,by=map(float,input().split())
    cx,cy=map(float,input().split())
    x1=ax-bx
    y1=ay-by
    x2=ax-cx
    y2=ay-cy
    s=cross(x1,y1,x2,y2) # 用面积表示,+表示左,-表示右,0表示IN
    if s>0:print("L")
    if s==0:print("IN")
    if s<0:print("R")

4.3点和线段的关系

def cross(x1,y1,x2,y2): #叉积
    return x1*y2-y1*x2

def dot(x1,y1,x2,y2): #点积
    return x1*x2+y1*y2

n=int(input())
for i in range(n):
    ax,ay=map(float,input().split())
    bx,by=map(float,input().split())
    cx,cy=map(float,input().split())
    x1=ax-cx
    y1=ay-cy
    x2=bx-cx
    y2=by-cy
    if cross(x1,y1,x2,y2)==0 and dot(x1,y1,x2,y2)<=0:
        print("Yes")
    else:
        print("No")

4.4点到直线距离

from math import *

def cross(x1,y1,x2,y2):
    return x1*y2-x2*y1

n=int(input())
for i in range(n):
    ax,ay=map(float,input().split())
    bx,by=map(float,input().split())
    cx,cy=map(float,input().split())
    x1=ax-bx
    y1=ay-by
    x2=ax-cx
    y2=ay-cy
    
    s=abs(cross(x1,y1,x2,y2))
    w=sqrt(x1*x1+y1*y1)
    print("{:.2f}".format(s/w))
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值