2548 自然数积分解

2548 自然数积分解

时间限制: 1 s

空间限制: 32000 KB

题目等级 : 黄金 Gold

题解

题目描述 Description

把自然数N分解为若干个自然数之积,输出方案数。

输入描述 Input Description

自然数N,(1≤n≤2000000000)

输出描述 Output Description

方案数

样例输入 Sample Input

20

样例输出 Sample Output

4

数据范围及提示 Data Size & Hint

20 可分为

20 
4 5
2 10
2 2 5

分类标签 Tags 点此展开

深度优先搜索 搜索

这个题数据很大(TLE了2个),所以必须优化, 
先看没优化的程序:

#include<cstdio>
#include<iostream>
using namespace std;
int sum;
void dfs(int k,int n){
    if(k>n/k) return ;
    for(int j=k;j<=n;j++){
        if(n%j==0&&j<=n/j){
            sum++;
            dfs(j,n/j);
        }
    }
}
int main(){
    int n;sum=1;
    scanf("%d",&n);
    dfs(2,n);
    printf("%d\n",sum);
    return 0;
}

优化思路 
一个数n,可以分为 1×n 2 X ….(n减小), 3× .. i× … 其中 i最大取到 √n,这样 数n 被分解为两个数的乘积 而左半部分的所有可能通过枚举各种可能值得到,而右半部分继续递归处理即可。这里在分解的时候会遇到 重复分析的情况,如16 可分为 2 4 4 ,与 4 4 2 ,因为分解时,是按照乘号左侧的数由小到大来分,因此左侧应该不大于右侧即可。所以函数的参数中传入前一次分解的数字,每次分解前先判断,是否右侧不小于左侧。最后的结果上要加上 1Xn ,因为自身也算是一种结果。

AC代码:

#include<cstdio>
#include<iostream>
using namespace std;
int sum=1;
void dfs(int k,int n){
    for(int j=2;j*j<=n;j++){
        if(k<=j&&n%j==0){
            sum++;
            dfs(j,n/j);
        }
    }
}
int main(){
    int n;
    scanf("%d",&n);
    dfs(1,n);
    printf("%d\n",sum);
    return 0;
}
时间: 2024-12-12 13:39:39

2548 自然数积分解的相关文章

自然数积分解

[题目描述] 把自然数N分解为若干个自然数之积,输出方案数. [输入描述] 自然数N(1 ≤ n ≤ 2000000000). [输出描述] 方案数. [样例输入] 20 [样例输出] 4 [数据范围及提示] 20 可分为: 204*52*102*2*5

【Codevs2549/2548】自然数和/积分解

自然数和分解 Description 把自然数N分解为若干个自然数之和,输出方案数. Input N,(1≤n≤50) Output 方案数 Sample Input 5 Sample Output 7 HINT 5 可分为 1 1 1 1 11 1 1 21 1 31 2 21 42 35 题解 解法1:完全背包 #include<iostream> #include<cstdio> using namespace std; int n,ans; int a [55]; int

codevs 2549 自然数和分解

时间限制: 1 s 空间限制: 32000 KB 题目等级 : 白银 Silver 题目描述 Description 把自然数N分解为若干个自然数之和,输出方案数. 输入描述 Input Description N,(1≤n≤50) 输出描述 Output Description 方案数 样例输入 Sample Input 5 样例输出 Sample Output 7 数据范围及提示 Data Size & Hint 5 可分为 1 1 1 1 11 1 1 21 1 31 2 21 42 35

2549 自然数和分解

2549 自然数和分解 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 白银 Silver 题解 查看运行结果 题目描述 Description 把自然数N分解为若干个自然数之和,输出方案数. 输入描述 Input Description N,(1≤n≤50) 输出描述 Output Description 方案数 样例输入 Sample Input 5 样例输出 Sample Output 7 数据范围及提示 Data Size & Hint 5 可分为 1 1 1 1 11

AC日记——自然数和分解 codevs 2549

自然数和分解 思路: 水题: 代码: #include <bits/stdc++.h> using namespace std; int n,dp[100][100]; int main() { cin>>n; dp[0][0]=1; for(int i=1;i<=n;i++) { for(int j=1;j<=i;j++) { for(int v=0;v<=j;v++) { dp[i][j]+=dp[i-j][v]; } } } int ans=0; for(i

自然数和分解

codevs——2549 自然数和分解 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 白银 Silver 题解 题目描述 Description 把自然数N分解为若干个自然数之和,输出方案数. 输入描述 Input Description N,(1≤n≤50) 输出描述 Output Description 方案数 样例输入 Sample Input 5 样例输出 Sample Output 7 数据范围及提示 Data Size & Hint 5 可分为 1 1 1 1 11

4.1将某个大于1的自然数n分解为其素因子的乘积

//将某个大于1的自然数n分解为其素因子的乘积 #include<iostream> using namespace std; int isprime(int i); int main() { int i,j=0,m,temp; int reserve[32]; cin>>m; temp=m; while(temp!=1) { for(i=2;i<=temp;i++) if(temp%i==0 &&isprime(i)) break; reserve[j++]

ACM算法集锦

kurXX最小生成树 #include <iostream> #include <math.h> #include <algorithm> using namespace std; #define M 501 #define LIM 20000000 struct edg{ int u,v; int w; }all_e[M*M/2]; bool operator < (const edg &a,const edg &b){ return a.w&l

深搜整理汇总

2801 LOL-盖伦的蹲草计划 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题目描述 Description 众所周知,LOL这款伟大的游戏,有个叫盖伦的英雄.他的伟大之处在于他特别喜欢蹲草丛阴人(XL:蹲草阴人也算英雄?!CZQ:没办法,个个都是这么玩的).某日,德玛西亚与诺克萨斯之间又发生了一场战斗,嘉文四世希望盖伦能带领一支K人的德玛西亚军队出战. 战斗发生在召唤师峡谷.整个召唤师峡谷被分割成M行N列的一个矩阵,矩阵中有空地和几片草丛.这几片草丛中有