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<=r;i++)
#define down(i,l,r) for (int i=l;i>=r;i--)
#define clr(x,y) memset(x,y,sizeof(x))
#define maxn 20050
#define ll long long
using namespace std;
int n,l;
int ans[maxn];
ll read(){
    ll x=0,f=1; char ch=getchar();
    while (!isdigit(ch)) {
        if (ch==‘-‘) f=-1; ch=getchar();
    }
    while (isdigit(ch)){
        x=x*10+ch-‘0‘; ch=getchar();
    }
    return x*f;
}
void get(int x){
    rep(i,1,l) ans[i]*=x;
    rep(i,1,l) ans[i+1]+=ans[i]/10,ans[i]=ans[i]%10;
    while (ans[l+1]) {l++,ans[l+1]+=ans[l]/10,ans[l]%=10;}
    //while (ans[l+1]) l++;
}
int main(){
    n=read();
    l=1; ans[1]=1;
    while (n>4) {
        get(3); n-=3;
    }
    get(n);
    printf("%d\n",l);
    if (l<=100) {
        down(i,l,1) printf("%d",ans[i]);
    }
    else {
        down(i,l,l-99) printf("%d",ans[i]);
    }
    puts("");
    return 0;
}
时间: 2024-10-03 22:40:34

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

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

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

整数划分递归模板

/* 整数划分问题是算法中的一个经典命题之一,有关这个问题的讲述在讲解到递归时基本都将涉及. 所谓整数划分,是指把一个正整数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 分析:这题关键在于不同的整数一个包含数字最多的划分必

hdu 1028 Ignatius and the Princess III 【整数划分】

Ignatius and the Princess III                                                                                       Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 15730    Accepted Submission(