码迷,mamicode.com
首页 > 其他好文 > 详细

BZOJ1263: [SCOI2006]整数划分

时间:2014-10-02 14:18:42      阅读:249      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   http   color   io   os   ar   for   

1263: [SCOI2006]整数划分

Time Limit: 1 Sec  Memory Limit: 162 MB
Submit: 677  Solved: 332
[Submit][Status]

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

 题解:

自然对数e具有最优分解性,真是一个神奇的常数。

所以我们的算法来了:

如果 n%3==0 那么 把n分成 n/3个3

如果 n%3==1 那么 把n分成 n/3-1个3和1个4

如果 n%3==2 那么 把n分成n/3个3和1个2

代码:

bubuko.com,布布扣
 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<algorithm>
 6 #include<iostream>
 7 #include<vector>
 8 #include<map>
 9 #include<set>
10 #include<queue>
11 #include<string>
12 #define inf 1000000000
13 #define maxn 5000+100
14 #define maxm 500+100
15 #define eps 1e-10
16 #define ll long long
17 #define pa pair<int,int>
18 #define for0(i,n) for(int i=0;i<=(n);i++)
19 #define for1(i,n) for(int i=1;i<=(n);i++)
20 #define for2(i,x,y) for(int i=(x);i<=(y);i++)
21 #define for3(i,x,y) for(int i=(x);i>=(y);i--)
22 #define mod 10
23 using namespace std;
24 inline int read()
25 {
26     int x=0,f=1;char ch=getchar();
27     while(ch<0||ch>9){if(ch==-)f=-1;ch=getchar();}
28     while(ch>=0&&ch<=9){x=10*x+ch-0;ch=getchar();}
29     return x*f;
30 }
31 int n,a[maxn];
32 void mul(int x)
33 {
34     for1(i,a[0])a[i]*=x;
35     for1(i,a[0])
36     {
37         a[i+1]+=a[i]/mod;
38         a[i]%=mod;
39     }
40     while(a[a[0]+1])a[0]++;
41 }
42 int main()
43 {
44     freopen("input.txt","r",stdin);
45     freopen("output.txt","w",stdout);
46     n=read();
47     a[a[0]=1]=1;
48     if(n%3==0)for1(i,n/3)mul(3);
49     else if(n%3==1)
50      {
51          for1(i,(n/3-1))mul(3);
52          mul(4);
53      }
54     else 
55      {
56          for1(i,n/3)mul(3);
57          mul(2);
58      }
59     printf("%d\n",a[0]);
60     for3(i,a[0],max(a[0]-100+1,1))printf("%d",a[i]);
61     printf("\n");    
62     return 0;
63 }
View Code

 

 

BZOJ1263: [SCOI2006]整数划分

标签:des   style   blog   http   color   io   os   ar   for   

原文地址:http://www.cnblogs.com/zyfzyf/p/4003954.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!