zoukankan      html  css  js  c++  java
  • hdu 2058 The sum problem

    http://acm.hdu.edu.cn/showproblem.php?pid=2058

    观察a+1,a+2…a+d全部相加等于m即(a+1+a+d)*d/2 = m,这里d是平方,我们可以从长度d入手,当a+1,a+2…a+3相加等于m时,即(a+1+a+d)*d/2 = m而a最小是0,所以(d+1)*d/2=m时d去最大值,就是这步把时间复杂度减小的。d就是sqrt(2*m),(a+1+a+d)*d/2 = m,所以a*d + (d+1)*d/2 = m,所以要使等式成立,m-(d+1)*d/2必须是d的倍数。

    代码:

    #include <stdio.h>

    #include <string.h>

    #include <stdlib.h>

    #include <math.h>

    int main()

    {

        int n,m,a,d;

        while(scanf("%d%d",&n,&m),n&&m)

        {

               d=(int)sqrt(2.0*m);

               for(int i=d;i>=1;--i)

               {

                       int t=m-i*(i+1)/2;

                       if(t%i==0)

                       printf("[%d,%d]\n",t/i+1,t/i+i);

               }

               puts("");

        }

        //system("pause");

        return 0;

    }

  • 相关阅读:
    打印图形II
    打印图形
    17倍
    进制转换
    小球
    最强素数
    最强阵容
    英雄卡
    数论模板
    畅通工程 (最小生成树)(最短路径和)
  • 原文地址:https://www.cnblogs.com/yuelingzhi/p/2132417.html
Copyright © 2011-2022 走看看