HDU 5312-Sequence(三角形数+推导)

题目地址:HDU 5312

题意:Soda习得了一个数列, 数列的第nn (n \ge 1)(n≥1)项是3n(n-1)+13n(n?1)+1. 现在他想知道对于一个给定的整数mm, 是否可以表示成若干项上述数列的和. 如果可以, 那么需要的最小项数是多少?例如, 22可以表示为7+7+7+17+7+7+1, 也可以表示为19+1+1+119+1+1+1.

思路:

三角形数形如n*(n-1)/2,他们形成的数列是1,3,6,10.......,同样也可以表示成n*(n+1)/2(表示方式不同)。

性质:任何一个正整数最多用三个三角形数就可以表示出来。

然后这道题的第n个数为3*n*(n-1)+1,所以可以表示成6*(n-1)*n/2+1,假设最少需要k个三角形数,设第i个三角形数为Ai,所以m=6*(A1+A2+A3+.....+AK)+k,所以当k>=3时,只需要判断一下(m-k)%6是不是等于0就可以了。然后当k=1和k=2的时候特判一下就好了。。

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <sstream>
#include <algorithm>
#include <set>
#include <queue>
#include <stack>
#include <map>
//#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;
typedef long long LL;
const int inf=0x3f3f3f3f;
const double pi= acos(-1.0);
const double esp=1e-6;
int maxn=1e9;
int a[100010];
int n;
int cnt1(int m)
{
    for(int i=1;i<=n;i++){
        if(a[i]==m)
            return 1;
    }
    return 0;
}
int cnt2(int m)
{
    int i;
    int j=n;
    for(i=1;i<n&&a[i]<m;i++){
        while(a[i]+a[j]>m)
            j--;
        if(a[i]+a[j]==m)
            return 1;
    }
    return 0;
}
int main()
{
    int T,m,i;
    memset(a,0,sizeof(a));
    for(int i=1;;i++){
        a[i]=3*i*(i-1)+1;
        if(a[i]>maxn){
            n=i;
            break;
        }
    }
    scanf("%d",&T);
    while(T--){
        scanf("%d",&m);
        if(cnt1(m)){
            puts("1");
            continue;
        }
        else if(cnt2(m)){
            puts("2");
            continue;
        }
        else{
            for(i=3;i<=n;i++){
                if((m-i)%6==0){
                printf("%d\n",i);
                break;
                }
            }
        }
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-10 13:28:39

HDU 5312-Sequence(三角形数+推导)的相关文章

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

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

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(数学推导+线性探查(两数相加版))

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

(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(数学思维)

题意:通式为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 Time Limit: 2000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 891    Accepted Submission(s): 271 Problem Description Today, Soda has learned a sequence whose n-th(n≥1) item is 3n(n?1)+1. Now he wa