B - The sum problem

小喵有很多女朋友。有一天,小喵想给女朋友们发玫瑰花。由于一些不(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>

#include<math.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)*/ 

  

猜你喜欢

转载自blog.csdn.net/hou_shiyu/article/details/80548042
今日推荐