欢迎访问~原文出处——博客园-zhouzhendong

去博客园看该题解


题目传送门 - BZOJ1263


题意概括

  将n写成若干个正整数之和,并且使这些正整数的乘积最大。 例如,n=13,则当n表示为4+3+3+3(或2+2+3+3+3)时,乘积=108为最大。


题解

  设F(n)为n的乘积ans。

  那么有:

  F(n) = 3 * F(n - 3)  n>4

  F(n) = n                 n<=4

  然后压位高精度跑一跑就可以了。

  证明我想大家都会吧。

  呵呵的我一开始输出了后100位,差错半天……


代码

#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long LL;
int n,x;
struct BigInt{
static const int MaxLen=600;
static const LL mod=1e9;
int d;
LL v[MaxLen];
void Print(){
printf("%lld",v[d]);
for (int i=d-1;i>0;i--)
printf("%09lld",v[i]);
}
void operator = (int x){
memset(v,0,sizeof v);
d=1,v[1]=x;
}
BigInt operator * (int x){
BigInt res=*this;
for (int i=1;i<=res.d;i++)
res.v[i]*=x;
for (int i=1;i<=res.d;i++)
res.v[i+1]+=res.v[i]/mod,res.v[i]%=mod;
while (res.v[res.d+1]>0)
res.d++,res.v[res.d+1]=res.v[res.d]/mod,res.v[res.d]%=mod;
return res;
}
void operator *= (int x){
*this=*this*x;
}
}Ans;
int digit(LL x){
int ans=0;
while (x)
x/=10,ans++;
return ans;
}
int Find_Digit(LL x,int y){
y--;
while (y--)
x/=10;
return x%10;
}
int main(){
scanf("%d",&n);
x=n%3;
if (x!=2)
x+=3;
n=(n-x)/3;
Ans=x;
for (int i=1;i<=n;i++)
Ans*=3;
printf("%d\n",(Ans.d-1)*9+(int)(log((double)Ans.v[Ans.d])/log(10)+1));
if (Ans.d>11){
int cnt=digit(Ans.v[Ans.d]),m=100-cnt;
printf("%lld",Ans.v[Ans.d]);
int i,j;
for (i=Ans.d-1;m>9;i--,m-=9)
printf("%09lld",Ans.v[i]);
for (j=m;j>=1;j--)
printf("%d",Find_Digit(Ans.v[i],j+9-m));
}
else
Ans.Print();
return 0;
}

  

BZOJ1263 [SCOI2006]整数划分 高精度的更多相关文章

  1. BZOJ 1263: [SCOI2006]整数划分( 高精度 )

    yy一下发现好像越小越好...分解成3*3*3*3……这种形式是最好的...然后就是高精度了 ----------------------------------------------------- ...

  2. BZOJ1263: [SCOI2006]整数划分

    1263: [SCOI2006]整数划分 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 677  Solved: 332[Submit][Status] ...

  3. bzoj1263: [SCOI2006]整数划分(高精度+构造)

    第一次写压位高精度只好抄黄学长的 代码最后一段想了好久一看评论区才知道黄学长写错了= =很气 自己最后改对了T^T 这题最优是一直划分3出来直到<=4 #include<iostream& ...

  4. 【bzoj1263】[SCOI2006]整数划分 高精度

    题目描述 从文件中读入一个正整数n(10≤n≤31000).要求将n写成若干个正整数之和,并且使这些正整数的乘积最大. 例如,n=13,则当n表示为4+3+3+3(或2+2+3+3+3)时,乘积=10 ...

  5. [BZOJ1263][SCOI2006]整数划分(数学+高精度)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1263 分析:数学老师上课讲过啦= =,就是尽可能3越多越好.然后就写个高精度就行了.

  6. bzoj 1263 [SCOI2006]整数划分

    n >= 6 的时候减3, 最后分类讨论, 上个Java import java.math.BigInteger; import java.util.*; public class Main { ...

  7. 大概是:整数划分||DP||母函数||递推

    整数划分问题 整数划分是一个经典的问题. Input 每组输入是两个整数n和k.(1 <= n <= 50, 1 <= k <= n) Output 对于每组输入,请输出六行. ...

  8. 51nod p1201 整数划分

    1201 整数划分 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 将N分为若干个不同整数的和,有多少种不同的划分方式,例如:n = 6,{6} {1,5} {2, ...

  9. 2014北大研究生推免机试(校内)-复杂的整数划分(DP进阶)

    这是一道典型的整数划分题目,适合正在研究动态规划的同学练练手,但是和上一个随笔一样,我是在Coursera中评测通过的,没有找到适合的OJ有这一道题(找到的ACMer拜托告诉一声~),这道题考察得较全 ...

随机推荐

  1. js 将很长的内容进行页面分页显示

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. 【洛谷P2704【NOI2001】】炮兵阵地

    题目描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图.在每一格平原地形上最 ...

  3. windows cmd相关操作

    一:文件夹1. 新建文件夹方式一:md[盘符:\][路径\]新目录例如:md c:\test\newtest 方式二:先使用cmd进入需要新建文件的根目录下,使用md或者mkdir 直接创建文件夹ne ...

  4. 【vim】缩写 :ab [缩写] [要替换的文字]

    一个很可能是最令人印象深刻的窍门是你可以在 Vim 中定义缩写,它可以实时地把你输入的东西替换为另外的东西.语法格式如下: :ab [缩写] [要替换的文字] 一个通用的例子是: :ab asap a ...

  5. Device Tree常用方法解析【转】

    转自:https://blog.csdn.net/airk000/article/details/21345159 Device Tree常用方法解析 Device Tree在Linux内核驱动中的使 ...

  6. 说说流控制(RTS/CTS/DTR/DSR 你都明白了吗?)【转】

    转自:http://bbs.ednchina.com/BLOG_ARTICLE_129041.HTM 以前写的博文,转过来 ============== 先引用一篇网文,作者不详,因几个地方都说自己是 ...

  7. nodejs package.json解释

    { "name": "node-echo", # 包名,在NPM服务器上须要保持唯一 "version": "1.0.0" ...

  8. openstack swift节点安装手册1-节点配置

    本文参照官方教程:http://docs.openstack.org/project-install-guide/object-storage/draft/environment-networking ...

  9. mysql数据库查询库中所有表所占空间大小

    SELECT CONCAT(table_schema,'.',table_name) AS 'TABLE_NAME', CONCAT(, ),'M') AS 'ROW_SIZE', CONCAT( ) ...

  10. CentOS6.5环境使用keepalived实现nginx服务的高可用性及配置详解

    keepalived基础概念    Keepalived是一个基于VRRP协议来实现的WEB服务高可用方案,可以利用其来避免单点故障.一个WEB服务至少会有2台服务器运行Keepalived,一台为主 ...