zoukankan      html  css  js  c++  java
  • HDU1868 Consecutive sum【数学计算+枚举】

    Consecutive sum

    Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 1590    Accepted Submission(s): 736

    Problem Description
    Every body knew that 15 = 1+2+3+4+5 = 4+5+6 = 7+8. Now give you a number N, tell me how many ways to represent N as a sum of consecutive positive integers. For example, 15 have 3 ways to be found.
    Input
    Each line will contain an signed 32-bits integer N. Process to end of file.
    Output
    For each case, output the answer in one line.
    Sample Input
    15 1050
    Sample Output
    3 11
    Author
    Wiskey
    Source

    问题链接HDU1868 Consecutive sum

    题意简述:参见上文。

    问题分析

    这个问题还是需要用数学方法来解决,即先做数学推导再编写暴力程序,否则容易TLE。

    对于输入的n,假设首项和末项为a和b的序列其和为n,即(a+b)*(b-a+1)/2==n。

    设a+b=x,b-a+1=y,则有方程组 x*y=n*2, 两式相加得x+y=2*b+1,故x+(2*n/x)=2*b+1。

    所以只要检测x能否整除2*n,并且使上面方程满足中b为正整数的情况。

    程序说明:(略)

    题记:(略)


    AC的C语言程序如下:

    /* HDU1868 Consecutive sum */
    
    #include <stdio.h>
    
    int main(void)
    {
        int n, ans, i;
        while(scanf("%d", &n) != EOF) {
            n*=2;
            ans = 0;
            for(i=2; i*i<=n; i++)
                if(n % i==0 && (i + n / i) % 2 == 1)
                    ans++;
    
            printf("%d
    ", ans);
        }
    
        return 0;
    }


    另外一个AC的C语言程序如下:

    /* HDU1868 Consecutive sum */
    
    #include <stdio.h>
    
    int main(void)
    {
        int n, ans, i;
        while(scanf("%d", &n) != EOF) {
            ans = 0;
            if(n % 2)
                ans++;
            for(i=2; i*i<=n; i++)
                if(n % i == 0) {
                    if(i % 2 != 0)
                        ans++;
                    if(n / i % 2 != 0)
                        ans++;
                }
            printf("%d
    ", ans);
        }
    
        return 0;
    }


    TLE的C++语言程序(尺取法)如下:

    /* HDU1868 Consecutive sum */
    
    #include <iostream>
    #include <stdio.h>
    
    using namespace std;
    
    int main()
    {
        int n;
        while(scanf("%d", &n) != EOF) {
            int start, end, sum, ans;
            start = end = 1;
            sum = ans = 0;
            for(;;) {
                while(end <= n && sum < n)
                    sum += end++;
    
                if (sum == n && end - start != 1)
                    ans++;
    
                sum -= start++;
    
                if (sum <= 0)
                    break;
            }
            printf("%d
    ", ans);
        }
    
        return 0;
    }




  • 相关阅读:
    第六课 使用oflash软件烧写bin文件至开发板
    Linux查看、添加、修改PATH环境变量
    第七课 Linux裸机开发+SourceInsight3.5使用+notepad++使用
    第五课 Linux高级命令
    数组的方法总结
    浅谈 return false 和preventDefault stopPropagation stopImmediatePropagation 的正确用法
    实时统计输入的文字
    滚轮滚动事件
    window.onload和DOMReady
    JS获取浏览器可视区域的尺寸
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7563629.html
Copyright © 2011-2022 走看看