hdoj2058(the sum problem

来源:互联网 发布:boost高并发网络框架 编辑:程序博客网 时间:2024/05/18 01:25
#include <math.h>#include <stdio.h>int main(){   long long int n,m;    while(scanf("%lld %lld",&n,&m)&&(n!=0||m!=0))    {        long long int d=(sqrt(1+8*m)-1)/2;        while(d)        {            long double a;            a=((2.0*m/d)+1-d)/2;            if(a==(long long int)a)            {                printf("[%lld,%lld]\n",(long long int)a,(long long int)a+d-1);            }            d--;        }        printf("\n");    }}

已AC

这题不能暴力啊。。。

先是求出最长的长度 当i=1时一直开始加 用等差数列的方程可以求解出最长的长度d(不用管他能不能整除,一定是最长的),嗯 然后就用最大的长度d一直往下递减,因为都是整数 用等差数列的表达式可以求出首项a和长度d的关系 然后因为a必然是整数 利用这个条件可以得出所有的区间 这样下来时间复杂度低了好多

0 0
原创粉丝点击