例如 N = 18 L = 2:
5 + 6 + 7 = 18
3 + 4 + 5 + 6 = 18
都是满足要求的,但是我们输出更短的 5 6 7
数据范围:
, 
输入数据包括一行: 两个正整数N(1 ≤ N ≤ 1000000000),L(2 ≤ L ≤ 100)
从小到大输出这段连续非负整数,以空格分隔,行末无空格。如果没有这样的序列或者找出的序列长度大于100,则输出No
18 2
5 6 7
30 13
No
无法由非负整数构成
x = input().split()
N = int(x[0])
L = int(x[1])
def solver(N,L):
if L%2==1 and N%L==0: return [N//L+(_-L//2) for _ in range(L)]
elif L%2==0 and (2*N/L)%2==1: return [N//L+(_-L//2+1) for _ in range(L)]
elif L<100: return solver(N,L+1)
else: return []
ans = solver(N,L)
if not ans:
print('No')
res = [str(_) for _ in ans]
print(' '.join(res)) ## Python 3.*
## Written by CheesePrawn on 25th May 2020
if __name__ == '__main__':
N, L = map(int, input().split(' '))
## 设定标签值,如果在接下来的程序中没有找到所需结果,最终输出No
not_find = True
## 根据题意 2<=L<=100, 界定循环次数
for l in range(L, 101):
## 根据公式进行计算
a_start = (2 * N - (l - 1) * l) / (2 * l)
## 如果所得结果为整数,即为我们所要找的起始值
if int(a_start) == a_start:
not_find = False
a_start = int(a_start)
## 依次输出,并以空格隔开,注意题意要求,最后一位结尾不需要空格,所以单独输出
for i in range(l - 1):
print(a_start + i, end=' ')
print(a_start + l - 1)
## 根据题意只需要找到最短的,l是从小到大,所以最先找到的即为所求,不用再进行循环了
break
## 如果没有找到,输出No
if not_find:
print("No")
参考lencha的解题思路 from math import floor
def shortest_series(N, L):
l = L
while l <= 100:
n = (2*N - l**2 - l) / (2*l)
if floor(n) == n:
n = int(n)
for i in range(l - 1):
n += 1
print(n, end=' ')
print(n + 1)
return
l += 1
print('No')
N, L = map(int, input().split())
shortest_series(N, L)
原理方面的解释已经有无数优秀答案,分享个人比较喜欢的风格嘻嘻
这道题让我在最后一句print输出格式上花了10分钟。。。太坑爹了,思想很简单,这是我在牛客上的第二道题,加油!
L,N=list(map(int,input().split(" ")))
n = N
state = False
y = L
while state ==False:
cnt =0
for i in range(n):
cnt+=i
# print(cnt)
x=(y-cnt)%n
if x==0:
state =True
if state ==True:
break
n+=1
if state==False or n>100:
print('No')
else:
ls =[]
k =(y-cnt)//n
for i in range(n):
ls.append(k)
k+=1
for i in range(len(ls)):
print(ls[i], end=' ' if i != len(ls)-1 else '')
'''
等差数列公式:an = a1 + (n-1)*d
求和公式: S = n(a1 + an)/2 = n * a1 + n(n-1)*d/2
此问题中:S = N n = L d = 1
则首项 a1 = (N*2/L+1-L)/2
'''
'''
核心函数-等差数列 返回数列的首项,如果求得的首项不是整数说明长度L不合适,返回-1,
若求得的首项是整数,说明此时长度L合适,返回首项的值
'''
from sys import stdin
def check(N, L):
if N * 2 % L == 0: # 确保能整除,得到的首项是整数
if (N * 2 / L + 1 - L) % 2 == 0: # 确保能整除,得到的首项是整数
if (N * 2 / L + 1 - L) / 2 >= 0: # 确保首项大于0
return (N * 2 / L + 1 - L) / 2 # 返回数列首项
return -1 # 无合适的数列首项,也就是首项不为整数
if __name__ == "__main__":
# rstrip()移除字符串头尾指定的字符(默认为空格或换行符)
ip_list = stdin.readline().rstrip().split(" ")
N = int(ip_list[0]) # 正整数N
L = int(ip_list[1]) (3731)# 长度L
while L <= 100:
x = check(N,L) # 寻找首项
if x != -1: # 如果返回的首项不是-1,说明找出了合适的首项
break # 跳出while循环
else: # 返回-1,说明还没找到合适的首项,即此时的长度L不合适
L += 1 # 长度k加1,判断下个长度有没有合适的首项
if x == -1:
print('No')
else:
# 现在找出了长度K,以及开头的数字x,接下来组装输出结果就可以了
res = ''
for i in range(L):
res += str(int(x+i))
if i < L-1: # 这个if判断的目的是最后的一个数后面不能带空格了
res += ' '
print(res) from sys import stdin
def check(N, L):
if N*2 % L == 0:
if (N*2/L+1-L)%2 == 0:
return (N*2/L+1-L)/2
return -1
if __name__ == "__main__":
ip_list = stdin.readline().rstrip().split(" ")
N = int(ip_list[0])
L = int(ip_list[1])
k = L
while k <=100:
x = check(N,k)
if x != -1:
break
k += 1
if x == -1:
print('No')
else:
res = ''
for i in range(k):
res += str(int(x+i))
if i < k-1:
res +=' '
print(res)
import math
str_in=input('')
alst=[int(n) for n in str_in.split()]
N=alst[0]
L=alst[1]
A=[]
B=[]
C=[]
i_end=int((math.sqrt(8*N)-1)/2)
for i in range(L,i_end+3):
if i%2==0 and (N/i)-int(N/i)==0.5:
for j in range(1,int(i/2)+1):
A.append(int(N/i-0.5*(j*2-1)))
A.append(int(N/i+0.5*(j*2-1)))
break
if i%2!=0 and (N/i)-int(N/i)==0:
A.append(int(N/i))
for j in range(1,int(i/2)+1):
A.append(int(N/i-1*j))
A.append(int(N/i+1*j))
break
A.sort()
if len(A)==0 or len(A)>100:
print('No')
else:
for k in range(len(A)):
A[k]=str(A[k])
print(' '.join(list(A)))