zoukankan      html  css  js  c++  java
  • HDU 2058:The sum problem(数学)

    The sum problem

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

    Problem Description

    Given a sequence 1,2,3,......N, your job is to calculate all the possible sub-sequences that the sum of the sub-sequence is M.

    Input

    Input contains multiple test cases. each case contains two integers N, M( 1 <= N, M <= 1000000000).input ends with N = M = 0.

    Output

    For each test case, print all the possible sub-sequence that its sum is M.The format is show in the sample below.print a blank line after each test case.

    Sample Input

    20 10
    50 30
    0 0

    Sample Output

    [1,4]
    [10,10]
    
    [4,8]
    [6,9]
    [9,11]
    [30,30]
    

    思路

    求公差为1的等差数列,在哪些区间内的和为m

    对等差数列的前n项和进行化简:

    a[1]=a,a[n]=b

    dfrac {left( a_{1}+a_{n}
ight) n}{2}=m可化为:(a+b)cdot (b-a+1)=2cdot m

    b-a+1=x,可得:a=dfrac {2m}{x}-bb=dfrac {x-1+dfrac {2m}{x}}{2}

    然后对于每一项i判断a和b是不是整数

    AC代码

    /*
    * @Author: WZY
    * @School: HPU
    * @Date:   2018-10-19 20:21:57
    * @Last Modified by:   WZY
    * @Last Modified time: 2018-10-19 20:39:18
    */
    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    #include <algorithm>
    #include <math.h>
    #include <limits.h>
    #include <map>
    #include <stack>
    #include <queue>
    #include <vector>
    #include <set>
    #include <string>
    #include <time.h>
    #define ll long long
    #define ull unsigned long long
    #define ms(a,b) memset(a,b,sizeof(a))
    #define pi acos(-1.0)
    #define INF 0x7f7f7f7f
    #define lson o<<1
    #define rson o<<1|1
    #define bug cout<<"---------"<<endl
    #define debug(...) cerr<<"["<<#__VA_ARGS__":"<<(__VA_ARGS__)<<"]"<<"
    "
    const double E=exp(1);
    const int maxn=1e6+10;
    const int mod=1e9+7;
    using namespace std;
    int main(int argc, char const *argv[])
    {
    	// ios::sync_with_stdio(false);
    	#ifndef ONLINE_JUDGE
    	    freopen("in.txt", "r", stdin);
    	    freopen("out.txt", "w", stdout);
    	    double _begin_time = clock();
    	#endif
    	int n,m;
    	while(cin>>n>>m)
    	{
    		if(n==0&&m==0)
    			break;
    		for(int i=sqrt(2*m);i>0;i--)
    		{
    			if(2*m%i==0&&(2*m/i-1+i)%2==0)
    			{
    				int b=(i-1+2*m/i)/2;
    				int a=2*m/i-b;
    				printf("[%d,%d]
    ",min(a,b),max(a,b));
    			}
    		}
    		printf("
    ");
    	}
    	#ifndef ONLINE_JUDGE
    	    double _end_time = clock();
    	    printf("time = %lf ms.", _end_time - _begin_time);
    	#endif
    	return 0;
    }
  • 相关阅读:
    算法习题---线性表之控制变量个数获取数据最小值
    C语言复习---矩形法求定积分函数
    sql server系统表详细说明
    sp_addlinkedserver 方法应用
    ipseccmd命令解析
    缓存淘汰算法(LFU、LRU、ARC、FIFO、MRU)分析
    uml定义的使用的关系
    GIS公交查询-flex/java
    arcgis软件集合
    arcgis地图数据集合
  • 原文地址:https://www.cnblogs.com/Friends-A/p/10324336.html
Copyright © 2011-2022 走看看