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

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

时间:2015-09-03 12:40:36      阅读:152      评论:0      收藏:0      [点我收藏+]

标签:

技术分享

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

---------------------------------------------------------------------------------

#include<bits/stdc++.h>
 
using namespace std;
 
struct INT {
static const int MAXN = 8000;
int s[MAXN], N;
INT(int _N = 0) {
N = _N;
memset(s, 0, sizeof s);
}
INT operator * (const INT &o) {
INT ret(N + o.N - 1);
for(int i = 0; i < N; i++)
   for(int j = 0; j < o.N; j++)
       ret.s[i + j] += s[i] * o.s[j];
for(int i = 0; i < ret.N; i++) if(ret.s[i] > 9) {
   ret.s[i + 1] += ret.s[i] / 10;
   ret.s[i] %= 10;
}
for(; ret.s[ret.N]; ret.N++) if(ret.s[ret.N] > 9) {
ret.s[ret.N + 1] += ret.s[ret.N] / 10;
ret.s[ret.N] %= 10;
}
return ret;
}
INT operator = (int x) {
for(N = 0; x; x /= 10) s[N++] = x % 10;
return *this;
}
INT operator = (const INT &o) {
N = o.N;
for(int i = 0; i < N; i++) s[i] = o.s[i];
return *this;
}
INT operator *= (const INT &o) {
return (*this = *this * o);
}
void read() {
N = 0;
char c = getchar();
for(; !isdigit(c); c = getchar());
for(; isdigit(c); c = getchar()) s[N++] = c - ‘0‘;
for(int l = 0,r = N - 1; l < r; l++, r--) swap(s[l], s[r]);
}
void write() {
printf("%d\n", N);
int t = N, cnt = 0;
for(; cnt < 100 && t--; cnt++)
   printf("%d", s[t]);
}
} N;
 
INT power(INT x, int k) {
INT ans; ans = 1;
for(; k; k >>= 1) {
if(k & 1) ans *= x;
x *= x;
}
return ans;
}
 
int main() {
int n; scanf("%d", &n);
int t = n / 3;
if(n % 3 == 1) t--;
N = 3;
N = power(N, t);
if(3 * t < n) {
   INT T; T = n - 3 * t;
   (T * N).write();
} else 
   N.write();
return 0;
}

--------------------------------------------------------------------------------- 

1263: [SCOI2006]整数划分

Time Limit: 1 Sec  Memory Limit: 162 MB
Submit: 907  Solved: 452
[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

 

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

标签:

原文地址:http://www.cnblogs.com/JSZX11556/p/4780022.html

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