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


    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 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

  • 相关阅读:
    pageControl点击白点时会变
    valueForKeyPath获取对象数组的属性
    探讨:通过循环数组或者集合,插入数据库中没有的数据
    Mybatis 中 Oracle 的拼接模糊查询
    Spring boot 中 Mybatis Plus 在 Oracle 新增数据时,主键自增问题
    在IntelliJ IDEA中,SpringBoot项目通过devtools实现热部署
    在 Mybatis 中遇到的那些坑
    华硕飞行堡垒耳机插进去之后再拔出来,电脑就没有声音了
    nyoj 776 删除元素
    nyoj 14 会场安排问题(贪心专题)java
  • 原文地址:https://www.cnblogs.com/JSZX11556/p/4780022.html
Copyright © 2020-2023  润新知