您的位置:首页 > 其它

bzoj1263

2015-09-03 14:19 239 查看
这个问题之前看过。。。尽量拆成3。。

然后。。。高精度没有压位居然过了。。

#include<bits/stdc++.h>
#define lowbit(a) ((a)&(-(a)))
#define clr(a,x) memset(a,x,sizeof(a))
#define rep(i,l,r) for(int i=l;i<(r);i++)
typedef long long ll;
using namespace std;
int read()
{
char c=getchar();
int ans=0,f=1;
while(!isdigit(c)){
if(c=='-') f=-1;
c=getchar();
}
while(isdigit(c)){
ans=ans*10+c-'0';
c=getchar();
}
return ans*f;
}
int n,cnt,re,a[5009];
int main()
{
n=read();
cnt=n/3;re=n%3;
if(re==1||!re){
re+=3;
cnt--;
}
a[0]=1;
rep(i,0,cnt){
rep(i,0,5009) a[i]*=3;
rep(i,0,5008) if(a[i]>9){
a[i+1]+=a[i]/10;
a[i]%=10;
}
}
rep(i,0,5009) a[i]*=re;
rep(i,0,5008) if(a[i]>9){
a[i+1]+=a[i]/10;
a[i]%=10;
}
int l;
for(int i=5008;~i;i--){
if(a[i]){
l=i;
break;
}
}
printf("%d\n",l+1);
for(int i=l;~i&&l-i<100;i--) putchar('0'+a[i]);
puts("");
return 0;
}


View Code

1263: [SCOI2006]整数划分

Time Limit: 1 Sec Memory Limit: 162 MB
Submit: 908 Solved: 453
[Submit][Status][Discuss]

Description

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

Input

只有一个正整数: n (10≤n≤31000)

Output

第1行输出一个整数,为最大乘积的位数。 第2行输出最大乘积的前100位,如果不足100位,则按实际位数输出最大乘积。 (提示:在给定的范围内,最大乘积的位数不超过5000位)。

Sample Input

13

Sample Output

3

108

HINT

Source

[Submit][Status][Discuss]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: