例如 N = 18 L = 2:
5 + 6 + 7 = 18
3 + 4 + 5 + 6 = 18
都是满足要求的,但是我们输出更短的 5 6 7
数据范围:
, ![](https://www.nowcoder.com/equation?tex=2%20%5Cle%20L%20%5Cle%20100%20%5C)
输入数据包括一行: 两个正整数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)))