n,m=map(int,input().split())
if n>m:
n,m=m,n
a=int((n*(n+1)/2)*(m*(m+1)/2))
x,y=0,0
for i in range(1,n+1):
x+=(n-i+1)*(m-i+1)
print(x,a-x)
注释:就是排列组合问题
n=int(input())
if n>30 or n<10:
print(0)
else:
ls=[]
for a in range(1,4):
for b in range(1,4):
for c in range(1,4):
for d in range(1,4):
for e in range(1,4):
for f in range(1,4):
for g in range(1,4):
for h in range(1,4):
for i in range(1,4):
for j in range(1,4):
if a+b+c+d+e+f+g+h+i+j==n:
ls.append([str(a),str(b),str(c),str(d),str(e),str(f),str(g),str(h),str(i),str(j)])
print(len(ls))
for x in ls:
print(" ".join(x))
注释:真就暴力枚举就行。
def hanshu(z,A,B,C,ls):
a,b=z*B,z*C
if a//A*A!=a or b//A*A!=b:
return False
a//=A
b//=A
di=[]
for o in (str(z),str(a),str(b)):
for O in o:
di.append(int(O))
di.sort()
if di==ls:
return True
else:
return False
A,B,C=map(int,input().split())
ls=[o for o in range(1,10)]
di=[]
for i in ls:
for j in ls:
if j==i:
continue
for k in ls:
if k==i or k==j:
continue
z=int(str(i)+str(j)+str(k))
if hanshu(z,A,B,C,ls)==True:
di.append([str(z),str(z*B//A),str(z*C//A)])
if di==[]:
print("No!!!")
else:
for o in di:
print(" ".join(o))
注释:一样直接暴力枚举就好。因为保证A
from math import sqrt
def hanshu1(n):
for i in range(2,int(sqrt(n))+1):
if n%i==0:
return False
else:
return True
def hanshu2(n):
m,ls=3,[2]
while m<=n:
for i in ls:
if m%i==0:
m+=1
break
else:
if hanshu1(m)==True:
ls.append(m)
m+=1
return ls
def hanshu(ls,m,x):
global di
if m==0:
di.append(x)
else:
m-=1
n=len(ls)
for i in range(n):
x+=ls[i]
hanshu(ls[i+1:],m,x)
x-=ls[i]
n,m=map(int,input().split())
ls=[int(i) for i in input().split()]
di=[]
x=hanshu(ls,m,0)
x=max(di)
sl=hanshu2(x)
count=0
for i in di:
if i in sl:
count+=1
print(count)
注释:递归遍历列表把每个值存储在列表中。因为害怕内存超限。使用了较为低端的欧拉筛法。当然时间会慢一点,但是够了。如果想要学习欧拉筛法可以看这。
n,m=map(int,input().split())
di=[]
ls=[i for i in range(1,n+1)]
def hanshu(ls,m,x):
global di
if m==0:
di.append(x.split())
else:
m-=1
y=len(ls)
for i in range(y):
z=x
x+=str(ls[i])+" "
hanshu(ls[i+1:],m,x)
x=z
hanshu(ls,m,"")
for i in di:
x=""
for k in i:
if len(k)==3:
y=""
y+=k
x+=y
elif len(k)==2:
y=" "
y+=k
x+=y
else:
y=" "
y+=k
x+=y
print(x)
注释:代码看起来挺长的,但是一半都是在输出的路上。挺简单的没啥要说。哎嘿,可以用format格式输出。你要这样输出也莫得问题哦。
for i in di:
for j in range(m):
print("{:>3s}".format(i[j]),end="")
print("")
代码一:
from itertools import permutations
n = int(input())
a = [str(i) for i in range(1,n+1)]
s = ""
s = s.join(a)
for i in permutations(s,n):
x=""
for j in i:
y=" "
y+=str(j)
x+=y
print(x)
注释:因为不超过9,反正这么做就对了。
代码二:
def hanshu(列表,x,y):
global di
if x==y:
z=""
for j in 列表:
y=" "
y+=j
z+=y
di.append(z)
else:
for i in range(x,y):
列表[x],列表[i]=列表[i],列表[x]
hanshu(列表,x+1,y)
列表[x],列表[i]=列表[i],列表[x]
n=int(input())
ls=[str(i) for i in range(1,n+1)]
di=[]
hanshu(ls,0,n)
di.sort()
for i in di:
print(i)
注释:一开始我还在想怎么字典序输出,结果sort()一下就好了。注意函数执行完成后不是字典序。一开始我还以为程序错误。这道题就是去递归交换交换列表元素顺序,不懂看这。
def hanshu():
global ls
for i in range(n-2,-1,-1):
if ls[i]<ls[i+1]:
break
for j in range(n-1,i,-1):
if ls[j]>ls[i]:
break
ls[i],ls[j]=ls[j],ls[i]
ls1=ls[:i+1]
ls2=ls[i+1:]
ls2.sort()
ls=ls1+ls2
n=int(input().strip())
m=int(input().strip())
ls=[int(i) for i in input().strip().split()]
for i in range(m):
hanshu()
for i in ls:
print(i,end=" ")
注释:这是洛谷第二个题解的翻译。
def hanshu(ls,n,m):
global sl
for i in range(n-m+1):
cnt=0
for j in range(n):
if j<i:
for k in ls[j]:
if k!="W":
cnt+=1
elif j>i+m-1:
for k in ls[j]:
if k!="R":
cnt+=1
else:
for k in ls[j]:
if k!="B":
cnt+=1
sl.append(cnt)
N,M=map(int,input().split())
ls=[]
for i in range(N):
sl=[i for i in input().rstrip()]
ls.append(sl)
cnt=0
for i in ls[0]:
if i!="W":
cnt+=1
ls.pop(0)
for i in ls[-1]:
if i!="R":
cnt+=1
ls.pop()
sl=[]
for i in range(1,N-1):
hanshu(ls,N-2,i)
print(min(sl)+cnt)
注释:更简单了,递归都不需要,直接就是硬想。不要老是天天递归,要出人命。
def hanshu(ls,K):
x=0
for i in ls:
y=0
for j in i:
if j==".":
y+=1
else:
if y>=K:
x+=y-K+1
y=0
else:
y=0
if y>=K:
x+=y-K+1
return x
R,C,K=map(int,input().split())
ls=[]
for i in range(R):
sl=[i for i in input().rstrip()]
ls.append(sl)
a=hanshu(ls,K)
m=[]
for i in range(C):
n=[]
for j in range(R):
n.append(ls[j][i])
m.append(n)
ls=m
b=hanshu(ls,K)
if K==1:
print((a+b)//2)
else:
print(a+b)
注释:一样就是硬想,没啥算法。
代码一:
from math import sqrt
def hanshu(x,y,z):
global ls,n,m
if y==x:
for i in ["1","3","5","7","9"]:
z+=i
hanshu(x,y-1,z)
z=z[:-1]
elif y==0:
j=int(z[1:][::-1]+z)
if j>=n and j<=m and zhishuhanshu(j)==True:
ls.append(j)
else:
for i in ["0","1","2","3","4","5","6","7","8","9"]:
z=i+z
hanshu(x,y-1,z)
z=z[1:]
def huiwenhanshu1(x):
x=x//2+1
hanshu(x,x,"")
def zhishuhanshu(n):
m=int(sqrt(n))+1
for i in range(2,m):
if n%i==0:
return False
return True
n,m=map(int,input().split())
x,y,ls=len(str(n)),len(str(m)),[]
for i in range(x,y+1):
if i%2==1:
huiwenhanshu1(i)
else:
if i==2:
if 11>=n and 11<=m:
ls.append(11)
ls.sort()
for i in ls:
print(i)
注释:这个完全AC。先生成回文数列表。然后暴力判断质数。
代码二:
from math import sqrt
def hanshu(a,b):
ls=[True]*(b+1)
c=int(sqrt(b))+1
d=2
while d<c:
if ls[d]==True:
for i in range(d+d,b+1,d):
ls[i]=False
d+=1
for i in range(a,b+1):
j=str(i)
if j==j[::-1]:
if ls[i]==True:
print(j)
a,b=map(int,input().split())
hanshu(a,b)
注释:欧拉筛法走到筛法尽头,还是不能过哦,基数太大。
n=int(input())
n-=4
di={0:6,1:2,2:5,3:5,4:4,5:5,6:6,7:3,8:7,9:6}
for i in range(10,10001):
j=str(i)
count=0
for k in j:
count+=di[int(k)]
di[i]=count
x=0
for i in range(0,1001):
for j in range(0,1001):
z=di[i]+di[j]
if z>=n:
continue
else:
k=i+j
if z+di[k]==n:
x+=1
print(x)
注释:直接造出一个字典去做。
n=int(input().strip())
ls,di=[],{}
for i in range(n):
m=int(input().strip())
if m not in di:
di[m]=1
ls.append(m)
else:
di[m]+=1
ls.sort()
m=len(ls)
cnt=0
for i in range(m):
if di[ls[i]]>=2:
a=ls[i]
A=di[a]
sl=[]
for j in range(i):
b=ls[j]
B=di[b]
c=a-b
if c==b:
cnt+=A*(A-1)*B*(B-1)//4
else:
if c in ls and c not in sl:
sl.append(b)
cnt+=A*(A-1)*B*di[c]//2
print(cnt%(pow(10,9)+7))
注释:明确告诉你这道题Py过不了。这个算法全LTE,但是的确是最优的算法。使用PyPy3确实快一点。但是不知道为什么报错。但实际答案是对滴。
def hanshu(ls,a,b,c,d):
global y
if b==0:
if c<=d:
e=d-c
if e<y:
y=e
else:
for i in range(a):
c+=ls[i]
if c>d:
return None
hanshu(ls[i+1:],a-i-1,b-1,c,d)
c-=ls[i]
s1,s2,s3,s4=map(int,input().strip().split())
ls1=[int(i) for i in input().strip().split()]
ls2=[int(i) for i in input().strip().split()]
ls3=[int(i) for i in input().strip().split()]
ls4=[int(i) for i in input().strip().split()]
ls=[[ls1,s1],[ls2,s2],[ls3,s3],[ls4,s4]]
x=0
for i in ls:
i[0].sort()
if i[1]==1:
x+=i[0][0]
elif i[1]==2:
x+=max(i[0])
else:
y=float('inf')
z=sum(i[0])/2
for j in range(1,i[1]):
hanshu(i[0],i[1],j,0,z)
x+=z+y
print(int(x))
注释:这道题使用PyPy3提交。Python3过不了,至少搜索算法过不了吧!我感觉我已经剪枝剪得不能再剪了。PyPy3之前能过,现在第一个数据过不了。它们修改了数据吧。
def hanshu(i,a,b):
global x
if i>n:
if a==1 and b==0:
return None
x=min(abs(a-b),x)
return None
hanshu(i+1,a*ls[i-1][0],b+ls[i-1][1])
hanshu(i+1,a,b)
x=float("inf")
n=int(input())
ls=[]
for i in range(n):
a,b=map(int,input().split())
ls.append([a,b])
hanshu(1,1,0)
print(x)
注释:广度优先搜索算法,没啥要所的吧。一定要加return None。不然会RE。