BestCoder 1st Anniversary ——HDU5312(数学推导)

 

 

Today, Soda has learned a sequence whose  n-th  (n1) item is  3n(n1)+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 integer  T  (1T104), indicating the number of test cases. For each test case:

There's a line containing an integer  m  (1m109).
 

 

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

 

 


题意:t组数据,每组数据给个m,问m最少能由几项形如3*n*(n-1)+1的数表示

eg 7=1(n=1)+1(n=1)+1(n=1)+1(n=1)+1(n=1)+1(n=1)+1(n=1);

     7=7(n=2);

     所以7最少能由1个数表示


分析:3*n*(n-1)+1可以转换为6*(n*(n-1)/2)+1,而n*(n-1)/2是一个三角形数,设为An,

则m可以表示为m=6*(A1+A2+…+Ak)+k(假设m最少能由k个数表示)看,由三角形数的性质(一个自然数最多能由三个三角形数表示)可得,


当k>=3时,A1+…+Ak可以表示任意自然数,此时k=(m-1)%6+1+6*n(n=0,1,2,…)(A1+A2+…Ak是自然数)此时最小值k取n=0,即k=(m-1)%6+1(k>=3).


另外,如果当n=0时k的值为1或者2,此时需要考虑是否存在一个或者两个三角形数能表示出该数m,如果可以,则k的最小值即为1或者2,如果不可以,则取n=1,k+=6;



 

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<map>
#include<iostream>
using namespace std;
const int maxn = 1e6+5;
map<int,int>Map;
int v[maxn];
int main()
{
    int t;
    for(int i=1;i<=100000;i++){ //预处理
        int tmp=3*i*(i-1)+1;
        if(tmp>1e9) break;
        v[i]=tmp;
        Map[tmp]=1;             //用于后面查看此数是否能够由3*n*(n-1)+1表示
    }
    scanf("%d",&t);
    while(t--)
    {
        int n;
        scanf("%d",&n);
        int k=(n-1)%6+1;        //(n-1)%6+1==n%6=0?6:n%6,两种写法都可以
        if(k>=3){               //k>=3,此时一定存在自然数能由A1+…Ak的数表示
            printf("%d\n",k);
        }
        else if(k==1){          //k==1 检验n是否能由该式子表示
            if(Map.count(n)) printf("1\n");
            else printf("7\n");
        }
        else if(k==2){          //k==2,检验n是否能由两个该式子的数表示
            int flag=0;
            for(int i=1;v[i]<=n/2;i++){
                if(Map.count(n-v[i])) flag=1;
            }
            if(flag) printf("2\n");
            else printf("8\n");
        }
    }
}

  

转载于:https://www.cnblogs.com/Przz/p/5409812.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值