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);
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 MBSubmit: 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
108