hdu 5312 Sequence(数学推导——三角形数)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5312

Sequence

Time Limit: 2000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)

Total Submission(s): 1336    Accepted Submission(s): 410

Problem Description

Today, Soda has learned a sequence whose
n-th(n≥1)
item is 3n(n?1)+1.
Now he wants to know if an integer m
can be represented as the sum of some items of that sequence. If possible, what are the minimum items needed?

For example, 22=19+1+1+1=7+7+7+1.

Input

There are multiple test cases. The first line of input contains an integerT(1≤T≤104),
indicating the number of test cases. For each test case:

There‘s a line containing an integer m(1≤m≤109).

Output

For each test case, output
?1
if m
cannot be represented as the sum of some items of that sequence, otherwise output the minimum items needed.

Sample Input

10
1
2
3
4
5
6
7
8
22
10

Sample Output

1
2
3
4
5
6
1
2
4
4

Source

BestCoder 1st Anniversary ($)

题目大意:给出一个序列3*n*(n-1)+1。再输入一个m,求构成给定n所需的最小个数。

(序列中的没一个数能够使用若干次)

解题思路:明白一下N*(N-1)/2为三角形数。性质:随意一个自然数都最多可由三个三角形数表示。 题目给的序列是3*n*(n-1)+1就能够转换为6*n*(n-1)/2+1。对于给定的值m,假如m须要k个数来表示。那么其一组解能够表示为m= 6*(K个三角形数的和)+K;
即随意由k个数组成的解 都有 (m-K)%6==0;那么仅仅要找到最小的k即为所求。

此外。对于序列的通式。当n=1或者n=2的时候,就会没有意义,所以对于1和2的时候须要特殊推断一下。

这是一道三角形数的推导及运用题目。

详见代码 。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>

using namespace std;

int a[100005];

bool check1(int m)
{
    for (int i=1; i<20010; i++)
    {
        if (a[i]==m)
            return 1;
    }
    return 0;
}

bool check2(int m)
{
    int j;
    for (int i=1,j=20010-1; i<20010&&a[i]<m; i++)
    {
        while (a[i]+a[j]>m)
            j--;
        if (a[i]+a[j]==m)
            return 1;
    }
    return 0;
}

int main()
{
    for (int i=0; i<20010; i++)
    {
        a[i]=3*i*(i-1)+1;
    }
    int t;
    scanf("%d",&t);
    while (t--)
    {
        int m;
        scanf("%d",&m);
        int flag=0;
        if (check1(m))
        {
            printf ("1\n");
            continue;
        }
        else if (check2(m))
        {
            printf ("2\n");
            continue;
        }
        else
        {
            for (int i=3; i<=8; i++) //循环到8的原因是由于模6的余数仅仅有0-5六个
            {
                if ((m-i)%6==0)
                {
                    printf ("%d\n",i);
                    flag=1;
                    break;
                }
            }
        }
        if (flag==0)
        {
            printf ("-1\n");

        }
    }
    return 0;
}
时间: 2024-10-08 00:06:09

hdu 5312 Sequence(数学推导——三角形数)的相关文章

hdu 5312 Sequence(数学思维)

题意:通式为3*i*(i-1)+1(n>=1)的数列中每个数可用若干次,求构成给定n所需的最小个数: 思路: 设构成n所需个数为x,则n=3*1*(1-1)+3*2*(2-1)+...+3*x*(x-1)+x;当时推到这一步就没有再做下去了: 然后整理得n=6*(sigma((i*(i-1)/2))+x(i*(i-1)为偶数); 也就是说n%6即为所求结果,当n%6=1,2时特判一下是否能找到满足条件的数: 二分查找:(手动二分)(STL二分) #include<cstdio> #inc

hdu 5312 Sequence【数学推导】

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5312 解法: 这个题看上去是一个贪心, 但是这个贪心显然是错的. 事实上这道题目很简单, 先判断1个是否可以, 然后判断2个是否可以. 之后找到最小的整数k (k > 2), 使得(m - k) mod 6 = 0即可. 证明如下: 3n(n-1)+1 = 6(n*(n-1)/2)+1, 注意到n*(n-1)/2是三角形数, 任意一个自然数最多只需要3个三角形数即可表示. 枚举需要k个. 事实上,

HDU 5312 Sequence(三角形数应用)——BestCoder 1st Anniversary ($)

传送门 Sequence Time Limit: 2000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 1424    Accepted Submission(s): 442 Problem Description Today, Soda has learned a sequence whose n-th (n≥1) item is 3n(n?1)+1. Now

hdu 5312 Sequence 三角形数

这道题可以用三角形数的性质解出来,所谓三角形数就是n*(n-1)/2其中n>2.就是1,3,6,10--,也可以表示为 n*(n+1)/2...性质:任何一个正整数最多用三个三角形数就可以表示出来,这道题是3*n*(n-1)+1,就可以 表示为6*(n*(n-1)/2)+1,假如m需要k(k>=3)个数来表示,就相当于6*(k个三角形数的和)+k = m:所以 只要判断(m-k)%6是否等于0就可以了.需要一个或两个数的时候需要特判一下.通过这道题了解了三角形数的这个神性质 贴代码: #inc

(BC 一周年) hdu 5312 Sequence

Sequence Accepts: 25 Submissions: 1442 Time Limit: 2000/2000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) 问题描述 Soda习得了一个数列, 数列的第nn (n \ge 1)(n≥1)项是3n(n-1)+13n(n−1)+1. 现在他想知道对于一个给定的整数mm, 是否可以表示成若干项上述数列的和. 如果可以, 那么需要的最小项数是多少? 例如, 22可以表示

HDU 5312 Sequence (规律题)

题意:一个序列的第n项为3*n*(n-1)+1,而 n>=1,现在给一个正整数m,问其最少由多少个序列中的数组成? 思路:首先,序列第1项是1,所以任何数都能构成了.但是最少应该是多少?对式子进行变形,6*(n*(n-1)/2)+1,看到了三角形数n*(n-1)/2,那么应该是6*(任意自然数)+x=m才对,因为最多只要3个三角形数就能组成任何自然数啦. 不妨试试m%6是多少?这样试图求x可以吗?因为任意自然数最多由3个组成,如果是k个,那么应该x>=k,别忘了还有个+1的项.x-k那部分,就

hdu 5312 Sequence(数学推导+线性探查(两数相加版))

Problem Description Today, Soda has learned a sequence whose n-th (n≥1) item is 3n(n−1)+1. Now he wants to know if an integer m can be represented as the sum of some items of that sequence. If possible, what are the minimum items needed? For example,

hdu 1719 Friend 数学推导

题链:http://acm.hdu.edu.cn/showproblem.php?pid=1719 Friend Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2099    Accepted Submission(s): 1058 Problem Description Friend number are defined recur

hdu.5211.Mutiple(数学推导 &amp;&amp; 在logn的时间内求一个数的所有因子)

Mutiple Accepts: 476 Submissions: 1025 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) 问题描述 wld有一个序列a[1..n], 对于每个1≤i<n, 他希望你求出一个最小的j(以后用记号F(i)表示),满足i<j≤n, 使aj为ai的倍数(即aj mod ai=0),若不存在这样的j,那么此时令F(i) = 0 保证1≤n≤10000,1≤