给你两个数n,m,意思是有一个序列长度n,他是1 2 3 4 ...n,然后让你输出所有连续和等于m的范围。
思路:
是个小水题,随便写几个数字就能发现规律了,我们可以枚举区间的长度,虽然数据范围是10Y,但是用程序跑一下就会发现其实没多大,好像是44720,总之不大,对于每一个长度,我们可以算他的中间的那个数,如果是奇数个长度,那么必须整除,如果是偶数个长度,除完之后必须是***.5,其余的细节自己找个数模拟下就知道怎么写了。
#include<stdio.h> int main () { int n ,m ,i; while(~scanf("%d %d" ,&n ,&m) && n + m) { int max = 0; int sum = 0; for(i = 1 ;1 ;i ++) { sum += i; if(sum > m) { max = i - 1; break; } } int a ,b; for(i = max ;i >= 1 ;i --) { if(i & 1) { if(m % i == 0) { a = m / i - i / 2; b = m / i + i / 2; if(b <= n) printf("[%d,%d] " ,a ,b); } } else { double tmp = m * 1.0 / i; if(tmp - m / i == 0.5) { a = m/i - i/2 + 1; b = m/i + i/2; if(b <= n) printf("[%d,%d] " ,a ,b); } } } printf(" "); } return 0; }