zoukankan      html  css  js  c++  java
  • [SCOI2006]整数划分

    http://www.lydsy.com/JudgeOnline/problem.php?id=1263

    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

    View Code
    /*
        http://www.lydsy.com/JudgeOnline/problem.php?id=1263
    */
    # include <cstdio>
    # include <cstring>
    
    # define N 5000 + 10
    
    int n;
    
    char a[N];
    
    int Square(char *s, int len)
    {
        int tmp, i, j;
        char t[N];
        
        memset(t, 0, sizeof(t));
        for (i = 0; i < len; ++i)
        for (j = 0; j < len; ++j)
        {
            tmp = t[i+j] + s[i]*s[j];
            t[i+j] = tmp % 10;
            t[i+j+1] += tmp / 10;
        }
        memcpy(s, t, sizeof(char)*(2*len));
        
        i = 2*len+2;
        while (i>0 && s[i] == 0) --i;        
        
        return i+1;
    }
    
    int Mul(char *s, int x, int len)
    {
        int tmp, c, i;
            
        c = 0;
        for (i = 0; i < len; ++i)
        {
            tmp = s[i] * x + c;
            s[i] = tmp % 10;
            c = tmp / 10;
        }
        while (c)
        {
            s[i++] = c % 10;
            c = c / 10;
        }
        
        return i;
    }
    
    int Pow(int base, int power, char *s)
    {
        int len = 1;
        s[0] = 1, s[1] = 0;
        for (int i = 31; i >= 0; --i)
        {
            len = Square(s, len);
            if ((power>>i) & 0x1) 
                len = Mul(s, base, len);
        }
        
        return len;
    }
    
    void solve(void)
    {
        if (n <= 4)
        {
            printf("1\n%d\n", n);
            return ;
        }
        
        memset(a, 0, sizeof(a));
        int y = n % 3, x = n / 3;    
        if (y == 1) 
            --x, y = 4;
        else
            x = n / 3;
        
        int len;
        len = Pow(3, x, a);
        if (y) len = Mul(a, y, len);
        
        printf("%d\n", len);
        for (int i = len-1; i>=0 && i>=len-100; --i)
            putchar(a[i]+'0');
        putchar('\n');
    }
    
    int main()
    {
    //    freopen("in.txt", "r", stdin);
    //    freopen("out.txt", "w", stdout);
        
        while (~scanf("%d", &n))
            solve();
        
        return 0;
    }

     

  • 相关阅读:
    2017.9.29 ubuntu安装mysql服务
    如何在树莓派上安装mjpeg-streamer(针对摄像头为UVC的)
    2016.9.22感想及收获
    GL-iNET路由器如何安装DDNS服务
    2016.7.5 记项目过程中犯的一个从未察觉的低级错误
    C++课程笔记 Lesson 01
    关于Jlink在linux系统下连接错误的解决方法
    如何通过命令提示符进入MySQL服务器
    java面试题
    hive面试题
  • 原文地址:https://www.cnblogs.com/JMDWQ/p/2606688.html
Copyright © 2011-2022 走看看