小喵有很多女朋友。有一天,小喵想给女朋友们发玫瑰花。由于一些不(ni)知(dong)道(de)的原因,小喵想按照以下规律给它的已排好序的N个女朋友们发玫瑰花: 给第一个女朋友发一支玫瑰花,给第二个女朋友发两支,给第三个女朋友发三支… 现在小喵想知道连续的几个女朋友手中的玫瑰花总和为M的所有可能, 你能帮助小喵吗?
Input输入包含多组测试数据。每组测试数据包含两个整数N,M( 1 <= N, M <= 1000000000)。 输入以N=M=0结束。
Output对于每组例子,输出连续的几个女朋友手中的玫瑰花总和为M的所有可能,以起始女朋友编号从小到大排序。
Sample Input
20 10 50 30 0 0
#include<stdio.h>
main()
{
int n,m;
int i,j,k,sum=0;
while(scanf("%d%d",&n,&m)!=EOF&&n>0&&m<1000000000000000&&m!=0&&n!=0)
{
j=pow(2.0*m,0.5);
for(j=j;j>0;j--)//循环区间
{
int i;
i=(2*m/j-j+1)/2;
if(j*(j+2*i-1)/2==m)
{
printf("[%d,%d]\n",i,(i+j-1));
}
}
printf("\n");
}return 0;
}/*高斯求和 和=(首项 + 末项)x项数 /2可知:区间[a,b]的各项和且b=a+i-1
2.转化该式子求出a,由a即可推导出b
(a+b)*i/2 = m
(a+b)*i = 2*m
(a+ a+i-1)*i = 2*m
2*a = 2*m/i + 1 – i
a = m/i –(i-1)/2
3.限定循环次数,条件需满足a>=1,即m/i –(i-1)/2>=1,化简可得i <= (int)sqrt(2 * m)*/