代码
#include <iostream>
#include <cmath>
using namespace std;
int main() {
int N, M;
cin>>N>>M;
while(N || M) {
int max = sqrt(2*M);
for(int len=max; len>0; len--) {
double start = (2.0*M/len-len+1.0)/2.0;
if(start-(int)start<1e-6) {
int end = (int)start+len-1;
printf("[%d,%d]\n", (int)start, end);
}
}
printf("\n");
cin>>N>>M;
}
return 0;
}
注解
1、首先依据当前案例给出的M和N,计算可能的最大长度(即从1开始的序列),可避免超时,减少时间复杂度!
2、按长度枚举,根据第二个式子计算相应长度下首项的值。如果首项为整数,则满足题意,末项为首项加上项数的长度减一。
3、如何判断是整数?用double与其对应的int型相减做差,如果差值小于给定的很小的数值则认定为整数:如:if(start-(int)start<1e-6)