bzoj 1263: [SCOI2006]整数划分

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 using namespace std;
 5 int a[3000],d[3000],n;
 6 void cheng(int a1)
 7 {
 8     for(int i=1;i<=a[0];i++)
 9       a[i]*=a1;
10     for(int i=1;i<a[0];i++)
11       {
12         a[i+1]+=a[i]/10000;
13         a[i]%=10000;
14       }
15     for(;a[a[0]]>=10000;)
16       {
17         a[a[0]+1]=a[a[0]]/10000;
18         a[a[0]]%=10000;
19         a[0]++;
20       }
21     return;
22 }
23 int xun(int a1)
24 {
25     if(a1<10)
26       return 1;
27     if(a1<100)
28       return 2;
29     if(a1<1000)
30       return 3;
31     return 4;
32 }
33 int main()
34 {
35     a[0]=1;
36     a[1]=1;
37     scanf("%d",&n);
38     for(;n>4;)
39       {
40         n-=3;
41         cheng(3);
42       }
43     cheng(n);
44     for(int i=1;i<=a[0];i++)
45       d[i]=xun(a[i]);
46     printf("%d\n",(a[0]-1)*4+d[a[0]]);
47     printf("%d",a[a[0]]);
48     int i;
49     for(i=a[0]-1;i>=max(1,a[0]-24);i--)
50       {
51         if(d[i]==1)
52           printf("000%d",a[i]);
53         if(d[i]==2)
54           printf("00%d",a[i]);
55         if(d[i]==3)
56           printf("0%d",a[i]);
57         if(d[i]==4)
58           printf("%d",a[i]);
59       }
60     if(i!=0)
61       {
62         if(d[a[0]]==3)
63           printf("%d",a[i]/1000);
64         if(d[a[0]]==2)
65           printf("%d",a[i]/100);
66         if(d[a[0]]==1)
67           printf("%d",a[i]/10);
68       }
69     return 0;
70 }

一个数分成的数乘积最大 要尽量分3,数据范围要求要用高精压位。

时间: 2024-08-27 23:51:03

bzoj 1263: [SCOI2006]整数划分的相关文章

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)

BZOJ1263: [SCOI2006]整数划分

题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1263 一眼就可以看出按3拆再乘上最后一个数.. 一开始写的太过sb.. 天灾人祸不可避. #include<cstring> #include<iostream> #include<algorithm> #include<cstdlib> #include<cstdio> #define rep(i,l,r) for (int i=l;i&l

BZOJ1263 [SCOI2006]整数划分 高精度

欢迎访问~原文出处--博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1263 题意概括 将n写成若干个正整数之和,并且使这些正整数的乘积最大. 例如,n=13,则当n表示为4+3+3+3(或2+2+3+3+3)时,乘积=108为最大. 题解 设F(n)为n的乘积ans. 那么有: F(n) = 3 * F(n - 3)  n>4 F(n) = n                 n<=4 然后压位高精度跑一跑就可以了. 证明我想大家都会吧. 呵呵的我一开始输出了后

bzoj 3612: [Heoi2014]平衡【整数划分dp】

其实就是-n~n中求选k个不同的数,和为0的方案数 学到了新姿势叫整数划分,具体实现是dp 详见:https://blog.csdn.net/Vmurder/article/details/42551603 设f[i][j]为j个数和为i的方案数,然后因为互不相同,所以转移的话有两种,就是当前j个数全部+1,和当前j个数全部+1并且多填一个1出来,也就是f[i][j]=f[i-j][j]+f[i-j][j-1] 但是这里要求选的数不能超过n,我们考虑i>n的f中一定有一个大于n的数,我们把这种情

整数划分递归模板

/* 整数划分问题是算法中的一个经典命题之一,有关这个问题的讲述在讲解到递归时基本都将涉及. 所谓整数划分,是指把一个正整数n写成如下形式: n=m1+m2+...+mi; (其中mi为正整数,并且1 <= mi <= n),则{m1,m2,...,mi}为n的一个划分. 如果{m1,m2,...,mi}中的最大值不超过m,即max(m1,m2,...,mi)<=m,则称它属于n的一个m划分.这里我们记n的m划分的个数为f(n,m); 例如但n=4时,他有5个划分,{4},{3,1},{

NYOJ746——整数划分(四)

整数划分(四) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 暑假来了,hrdv 又要留学校在参加ACM集训了,集训的生活非常Happy(ps:你懂得),可是他最近遇到了一个难题,让他百思不得其解,他非常郁闷..亲爱的你能帮帮他吗? 问题是我们经常见到的整数划分,给出两个整数 n , m ,要求在 n 中加入m - 1 个乘号,将n分成m段,求出这m段的最大乘积 输入 第一行是一个整数T,表示有T组测试数据 接下来T行,每行有两个正整数 n,m ( 1<= n <

NYOJ-571 整数划分(三)

此题是个非常经典的题目,这个题目包含了整数划分(一)和整数划分(二)的所有情形,而且还增加了其它的情形,主要是用递归或者说是递推式来解,只要找到了递推式剩下的任务就是找边界条件了,我觉得边界也是非常重要的一步,如果找不准边界,这个题也很难做出来,当时我就是找边界找了好长时间,边界得琢磨琢磨.递推步骤如下: 第一行:将n划分成若干正整数之和的划分数.状态转移方程:dp[i][j]:和为i.最大数不超过j的拆分数dp[i][j]可以分为两种情况:1.拆分项至少有一个j 2.拆分项一个j也没有dp[i

算法笔记——整数划分3

题目来源:POJ1664-放苹果 和POJ3014 问题描述: 把m个同样的苹果放在n个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法. 输入: 第一行是测试数据的数目t(0 <= t <= 20).以下每行均包含二个整数m和n,以空格分开.1<=m,n<=10. 输出: 对输入的每组数据m和n,用一行输出相应的K. 分析: 问题描述转换成整数划分形式:把一个正整数m分成至多n个正整数的和,有多少种分法? 假设用f(m,

51nod p1201 整数划分

1201 整数划分 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 将N分为若干个不同整数的和,有多少种不同的划分方式,例如:n = 6,{6} {1,5} {2,4} {1,2,3},共4种.由于数据较大,输出Mod 10^9 + 7的结果即可. Input 输入1个数N(1 <= N <= 50000). Output 输出划分的数量Mod 10^9 + 7. Input示例 6 Output示例 4 分析:这题关键在于不同的整数一个包含数字最多的划分必