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;
    }




  • 相关阅读:
    支付宝 微信支付 移动支付 网站支付 开发
    2017 开源中国评比的前100个优秀开源项目
    解决error: Your local changes to the following files would be overwritten by merge
    Spring-JDBC配置
    server library[unbound] 服务未绑定解决办法
    MyEclipse安装EGit插件方法
    使用GitHub和Eclipse进行javaEE开发步骤
    Spring-AOP
    SQL-字符串连接聚合函数
    Spring-注入外部值
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7563629.html
Copyright © 2011-2022 走看看