【HDU 5312】Sequence(数学问题)

这个题看上去是一个贪心, 但是这个贪心显然是错的. 事实上这道题目很简单, 先判断1个是否可以, 然后判断2个是否可以. 之后找到最小的k
(k > 2)k(k>2),
使得(m - k) mod 6 =
0(m?k)mod6=0即可.

证明如下: 3n(n-1)+1 =
6(n*(n-1)/2)+13n(n?1)+1=6(n?(n?1)/2)+1,
注意到n*(n-1)/2n?(n?1)/2是三角形数,
任意一个自然数最多只需要3个三角形数即可表示. 枚举需要kk个,
那么显然m=6(km=6(k个三角形数的和)+k)+k,
由于k \ge 3k≥3,
只要m-km?k是6的倍数就一定是有解的.

事实上, 打个表应该也能发现规律.

学了下三角形数的性质:

1.任意一个数都可以由三个三角形术表示

2.任何三角形数 * 8  + 1得到一个平方数

3.验证三角形数的公式:

n = (sqrt ( 8  *  X  +  1 ) - 1) / 2

如果为三角形数那么n为整数切为第n个

三角数具体连接:http://baike.baidu.com/view/1047488.htm

#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn = 100000;
const int INF  = 1000000000;
int _list[maxn],cnt = 1,n;
void init(){
    while(1){
        _list[cnt] = 3 * cnt * (cnt - 1) + 1;
        if(_list[cnt] > INF) break;
        cnt ++;
    }
}
int Find(int value){
    return lower_bound(_list + 1,_list + cnt,value) - _list;
}
bool solve(int v){
    int l = 1,r = Find(v);
    while(l <= r){
        if(_list[l] + _list[r] > v)
            r --;
        else if(_list[l] + _list[r] < v)
            l ++;
        else
            return true;
    }
    return false;
}
bool can(int n){
    int d = (n - 1);
    if(d % 6 == 0){
        d /= 6;
        double dd = (sqrt(8.0 * d + 1.0) - 1.0) / 2;
        if(dd == (int)dd)
            return true;
    }
    return false;
}
int main(){
    init();
    int T;
    scanf("%d",&T);
    while(T--){
        scanf("%d",&n);
        /*
            这里说一下,如果暴力找的话时间话费46ms
            如果利用判断是否为三角数的性质时间为31ms
        */
        /*if(_list[Find(n)] == n){
            printf("1\n");
        }*/
        if(can(n)){
            printf("1\n");
        }
        else{
            if((n - 2) % 6 == 0 && solve(n))
                printf("2\n");
            else{
                for(int i = 3; ; i++)
                    if((n - i) % 6 == 0){
                        printf("%d\n",i);
                        break;
                    }
            }
        }
    }
    return 0;
}

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

时间: 2024-11-14 12:22:42

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

(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(三角形数应用)——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项为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 三角形数

这道题可以用三角形数的性质解出来,所谓三角形数就是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 1005 Number Sequence (数学规律)

Number Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 104190    Accepted Submission(s): 25232 Problem Description A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A

HDU 3397 Sequence operation(线段树)

HDU 3397 Sequence operation 题目链接 题意:给定一个01序列,有5种操作 0 a b [a.b]区间置为0 1 a b [a,b]区间置为1 2 a b [a,b]区间0变成1,1变成0 3 a b 查询[a,b]区间1的个数 4 a b 查询[a,b]区间连续1最长的长度 思路:线段树线段合并.须要两个延迟标记一个置为01,一个翻转,然后因为4操作,须要记录左边最长0.1.右边最长0.1,区间最长0.1,然后区间合并去搞就可以 代码: #include <cstdi