BZOJ1263 [SCOI2006]整数划分 高精度
欢迎访问~原文出处——博客园-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]整数划分 高精度的更多相关文章
- BZOJ 1263: [SCOI2006]整数划分( 高精度 )
yy一下发现好像越小越好...分解成3*3*3*3……这种形式是最好的...然后就是高精度了 ----------------------------------------------------- ...
- BZOJ1263: [SCOI2006]整数划分
1263: [SCOI2006]整数划分 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 677 Solved: 332[Submit][Status] ...
- bzoj1263: [SCOI2006]整数划分(高精度+构造)
第一次写压位高精度只好抄黄学长的 代码最后一段想了好久一看评论区才知道黄学长写错了= =很气 自己最后改对了T^T 这题最优是一直划分3出来直到<=4 #include<iostream& ...
- 【bzoj1263】[SCOI2006]整数划分 高精度
题目描述 从文件中读入一个正整数n(10≤n≤31000).要求将n写成若干个正整数之和,并且使这些正整数的乘积最大. 例如,n=13,则当n表示为4+3+3+3(或2+2+3+3+3)时,乘积=10 ...
- [BZOJ1263][SCOI2006]整数划分(数学+高精度)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1263 分析:数学老师上课讲过啦= =,就是尽可能3越多越好.然后就写个高精度就行了.
- bzoj 1263 [SCOI2006]整数划分
n >= 6 的时候减3, 最后分类讨论, 上个Java import java.math.BigInteger; import java.util.*; public class Main { ...
- 大概是:整数划分||DP||母函数||递推
整数划分问题 整数划分是一个经典的问题. Input 每组输入是两个整数n和k.(1 <= n <= 50, 1 <= k <= n) Output 对于每组输入,请输出六行. ...
- 51nod p1201 整数划分
1201 整数划分 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 将N分为若干个不同整数的和,有多少种不同的划分方式,例如:n = 6,{6} {1,5} {2, ...
- 2014北大研究生推免机试(校内)-复杂的整数划分(DP进阶)
这是一道典型的整数划分题目,适合正在研究动态规划的同学练练手,但是和上一个随笔一样,我是在Coursera中评测通过的,没有找到适合的OJ有这一道题(找到的ACMer拜托告诉一声~),这道题考察得较全 ...
随机推荐
- Python中的包ImportError
前言 Python中的包给我提供了很好的代码组织,相似的功能模块放在同一个包内,不仅代码结构清晰,而且调用起来也比较方便(可以用*导入) 但是,我们在刚开始使用Python包的时候总是会遇到导入错误& ...
- scapy官方文档
https://thepacketgeek.com/scapy-p-04-looking-at-packets/ http://biot.com/capstats/bpf.html filter语 ...
- bzoj1477: 青蛙的约会(exgcd)
昨天打code+的时候发现自己已经不大会exgcd了..赶紧复习一下QAQ 求$ax+by=gcd(a,b)$的解 初始条件 $gcd(a, 0)=a$ $x=1,y=0$ 推导过程 $gcd(a,b ...
- luogu P3576 [POI2014]MRO-Ant colony
传送门 一群蚂蚁能被吃,也就是走到指定边的两端点之一要走到另一端点时有\(k\)只,我们可以从这两端点逆推,记两个值为走到某个点时最后会被吃掉\(k\)只蚂蚁的蚂蚁数量范围,式子下面有,很好理解(雾) ...
- 解决 ionic 中的 CORS(跨域)
译者注:本人翻译功力有限,所以文中难免有翻译不准确的地方,凑合看吧,牛逼的话你看英文版的去,完事儿欢迎回来指正交流(^_^) 如果你通过 ionic serve 或者 ionic run 命令使用或 ...
- python3字符串与文本处理
每个程序都回涉及到文本处理,如拆分字符串.搜索.替换.词法分析等.许多任务都可以通过内建的字符串方法来轻松解决,但更复杂的操作就需要正则表达式来解决. 1.针对任意多的分隔符拆分字符串 In [1]: ...
- Linux动态频率调节系统CPUFreq之一:概述【转】-- 非常好的博客
转自:http://blog.csdn.net/droidphone/article/details/9346981 目录(?)[-] sysfs接口 软件架构 cpufreq_policy ...
- ES系列目录
ES系列一.CentOS7安装ES 6.3.1 ES系列二.CentOS7安装ES head6.3.1 ES系列三.基本知识准备 ES系列四.ES6.3常用api之文档类api ES系列五.ES6.3 ...
- HDU 1573
/* 同余方程组为 X = ri (mod ai) 在范围内求X的个数 先求出特解 X0: 求出 ai数组的LCM: 则有 Xi = X0+LCM 均能满足方程组,判断是否在范围内!! */ #inc ...
- 树形插件 --- zTree
地址:http://www.treejs.cn/v3/api.php