首页 > 其他分享 >Luogu P1249 最大乘积

Luogu P1249 最大乘积

时间:2024-01-24 22:11:07浏览次数:30  
标签:正整数 乘积 int Luogu sum 自然数 样例 P1249

最大乘积

题目描述

一个正整数一般可以分为几个互不相同的自然数的和,如 \(3=1+2\),\(4=1+3\),\(5=1+4=2+3\),\(6=1+5=2+4\)。

现在你的任务是将指定的正整数 \(n\) 分解成若干个互不相同的自然数的和,且使这些自然数的乘积最大。

输入格式

只一个正整数 \(n\),(\(3 \leq n \leq 10000\))。

输出格式

第一行是分解方案,相邻的数之间用一个空格分开,并且按由小到大的顺序。

第二行是最大的乘积。

样例 #1

样例输入 #1

10

样例输出 #1

2 3 5
30

思路

本题要先用数论和贪心找到最优解的组成方法,再用高精度乘法求积。

先来列举观察:
\(3=3\)
\(4=4\)
\(5=2+3\)
\(6=3+3\)
\(8=3+5\)
\(9=2+3+4\)
\(10=2+3+5\)

观察发现,几乎每个正整数都可以使用近乎相邻的数字之和表示,而这恰好是最大乘积的方案。于是就顺着发现大胆猜测:自然数的分解乘积最大方案是一组相邻的数字序列。

接着便萌生了贪心的猜想:循环列举数字2,3,4,…,n\(^{1}\),同时求总和sum,当sum大于n时停止循环,将序列中sum-n的元素删去,使得sum=n,这正好是最终方案。

最后,再套用高精度乘法模版即可。

#include<bits/stdc++.h>
using namespace std;
int a[10001];
int b[10001],len=1;
void sv(int x)
{
	for(int i=1;i<=len;i++)
	{
		b[i]*=x;
	}
	for(int i=1;i<=len;i++)
	{
		b[i+1]+=b[i]/10;
		b[i]%=10;
	}
	while(b[len+1]!=0)
	{
		len++;
		b[len+1]+=b[len]/10;
		b[len]%=10;
	}
}
int main()
{
	ios::sync_with_stdio(false);
	int n;
	cin>>n;
	if(n<=4)
	{
		cout<<n<<endl<<n<<endl;
		return 0;
	}
	int sum=0,k=0;
	for(int i=2;sum<n;sum+=i,i++)
	{
		k++;
		a[k]=i;
	}
	if(sum>n+1)
	{
		a[sum-n-1]=0;
	}
	else if(sum==n+1)
	{
		a[k]+=1,a[1]=0;
	}
	b[0]=b[1]=1;
	for(int i=1;i<=k;i++)
	{
		if(a[i])
		{
			cout<<a[i]<<" ";
			sv(a[i]);
		}
	}
	cout<<endl;
	for(int i=len;i>=1;i--)
	{
		cout<<b[i];
	}
	cout<<endl;
	return 0;
}

标签:正整数,乘积,int,Luogu,sum,自然数,样例,P1249
From: https://www.cnblogs.com/j1hx-oi/p/17985976

相关文章

  • 洛谷题单指南-模拟和高精度-P1249 最大乘积
    原题链接:https://www.luogu.com.cn/problem/P1249题意解读:题目分两步,第一步是将整数拆分成不同自然数的和,第二步通过高精度计算这些因数的乘积,要使乘积最大,需要某种贪心思想。解题思路:如何保证整数拆分后因子的乘积最大呢,有几个原则:1、最好不要包括因子1,但3、4除外,需要进行特......
  • 238.除自身以外数组的乘积
    1.题目介绍给你一个整数数组nums,返回数组answer,其中answer[i]等于nums中除nums[i]之外其余各元素的乘积。题目数据保证数组nums之中任意元素的全部前缀元素和后缀的乘积都在32位整数范围内。请不要使用除法,且在O(n)时间复杂度内完成此题。示例1:输入:nu......
  • Luogu P1518 [USACO2.4] 两只塔姆沃斯牛
    [USACO2.4]两只塔姆沃斯牛TheTamworthTwo\(\color{cyan}link\)题目描述两只牛逃跑到了森林里。FarmerJohn开始用他的专家技术追捕这两头牛。你的任务是模拟他们的行为(牛和John)。追击在\(10\times10\)的平面网格内进行。一个格子可以是:一个障碍物,两头牛(它们总在一......
  • Luogu P4924 [1007] 魔法少女小Scarlet
    [1007]魔法少女小Scarlet\(\color{cyan}link\)题目描述Scarlet最近学会了一个数组魔法,她会在\(n\timesn\)二维数组上将一个奇数阶方阵按照顺时针或者逆时针旋转\(90^\circ\)。首先,Scarlet会把\(1\)到\(n^2\)的正整数按照从左往右,从上至下的顺序填入初始的二维数组......
  • Luogu P1563 [NOIP2016 提高组] 玩具谜题
    [NOIP2016提高组]玩具谜题\(link\)题目背景NOIP2016提高组D1T1题目描述小南有一套可爱的玩具小人,它们各有不同的职业。有一天,这些玩具小人把小南的眼镜藏了起来。小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的面朝圈外。如下图:这时singer告诉小南一个谜题:“......
  • Luogu P1042 [NOIP2003 普及组] 乒乓球
    [NOIP2003普及组]乒乓球\(link\)题目背景国际乒联现在主席沙拉拉自从上任以来就立志于推行一系列改革,以推动乒乓球运动在全球的普及。其中\(11\)分制改革引起了很大的争议,有一部分球员因为无法适应新规则只能选择退役。华华就是其中一位,他退役之后走上了乒乓球研究工作,意图......
  • 玩玩luogu算法题——第1期
    昨天已经把所有大作业写完了,所以今天就想去做一些有趣的事情...今天做的题都不是特别难,除了最后一题(写了大概1000多行Markdown,结果能Accepted的代码居然只有十几行?!)目标:希望暑假的时候每天都能更新一点算法题的随笔出来,加油~P1000超级玛丽游戏(一个非常入门的题目,作用是用来快速......
  • [刷题技巧] LeetCode238. 除自身以外数组的乘积
    题目描述思路:前缀/后缀乘积数组构造除自身以外数组的左边前缀乘积构造除自身以外数组的右边后缀乘积然后对应位置相乘方法一:classSolution{publicint[]productExceptSelf(int[]nums){intn=nums.length;//前缀乘积数组:leftProduct[i]表......
  • [Luogu] P1058 [NOIP2008 普及组] 立体图
    P1058[NOIP2008普及组]立体图模拟赛时候要是做出来这题就能拿饮料了:(题目传送门思路先打个输出长方体的函数:(其中\((x,y)\)表示该长方体的左上角)voiddraw(intx,inty){c[x][y+2]='+';c[x][y+6]='+';c[x+2][y]='+';c[x+2][y+4]='+';c[x+5][y]='+';c[x+5]......
  • 求除自身外的乘积
    求除自身外的乘积题目给你一个整数数组nums,返回数组answer,其中answer[i]等于nums中除nums[i]之外其余各元素的乘积。题目数据保证数组nums之中任意元素的全部前缀元素和后缀的乘积都在32位整数范围内。请不要使用除法,且在O(n)时间复杂度内完成此题。题......