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

自然数和分解

Description

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

Input

N,(1≤n≤50)

Output

方案数

Sample Input

5

Sample Output

7

HINT

5 可分为

1 1 1 1 1
1 1 1 2
1 1 3
1 2 2
1 4
2 3
5

题解

解法1:完全背包

#include<iostream>
#include<cstdio>
using namespace std;
int n,ans;
int a [55];
int main()
{
    scanf("%d",&n);
    a[0] = 1;
    for (int i=1;i<=n;i++)
        for (int j=1;j<=n;j++)
        {
            if (j>=i)
                a[j] += a[j-i];
        }
    printf("%d",a[n]);
}

解法2:搜索

x表示在上一步中减去哪个数,rest表示剩下的数。

当rest为0时得到一种方案

i : x->rest 保证了不会重复

#include<iostream>
#include<cstdio>
using namespace std;
int ans,n;
void dfs(int x,int rs)
{
    if (rs == 0)
    {
        ans++; return;
    }
    for (int i=x;i<=rs;i++)
        dfs(i,rs-i);
}
int main()
{
    scanf("%d",&n);
    dfs(1,n);
    cout<<ans;
}

自然数积分解

Description

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

Input

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

Output

方案数

Sample Input

20

Sample Output

4

HINT

20 可分为

20 
4 5
2 10
2 2 5

题解

和上边那题一样,当rest等于1时得到一个答案

60分

#include<iostream>
#include<cstdio>
using namespace std;
int n,ans;
void dfs(int x,int rs)
{
    if (rs == 1) ans++;
    for (int i=x;i<=rs;i++)
        if (rs % i ==0 && i!=1)
            dfs(i,rs/i);
}
int main()
{
    scanf("%d",&n);
    dfs(1,n);
    printf("%d",ans);
}

这个题数据范围太大,需要优化。

当找到一个i使得rs模i=0时,就说明找到了一组解,而约数可能还可以继续分解

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int n,ans=1;
void dfs(int x,int rs)
{
    for (int i=x;i<=sqrt(rs);i++)
        if (rs % i ==0)
            ans++,dfs(i,rs/i);
}
int main()
{
    scanf("%d",&n);
    dfs(2,n);
    printf("%d",ans);
}
时间: 2024-10-07 09:24:28

【Codevs2549/2548】自然数和/积分解的相关文章

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 52

自然数积分解

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

自然数n的分解

输入自然数n(n<100),输出所有和的形式.不能重复. 如:4=1+1+2:4=1+2+1;4=2+1+1 属于一种分解形式. 样例: 输入: 7 输出: 7=1+6 7=1+1+5 7=1+1+1+4 7=1+1+1+1+3 7=1+1+1+1+1+2 7=1+1+1+1+1+1+1 7=1+1+1+2+2 7=1+1+2+3 7=1+2+4 7=1+2+2+2 7=1+3+3 7=2+5 7=2+2+3 7=3+4 分析: 假设n=a[1]+a[2]+...+a[n],为了避免分解重复,可

有理数分解-数论

题目描述 Description 任何一个[0,1]中的有理数p/q(p.q均为自然数)一定可以分解成1/r1+1/r2+1/r3+-+1/rk,且r1<r2<r3<-<rk.当然这样的分解不是唯一的,如5/6=1/2+1/3=1/2+1/5+1/8+1/120,第一个分解式中的第二项比第二个分解式中的第二项大,因此我们可以定义第一个分解式比第二个分解式大. 程序要求找出p/q的最大分解式. 输入输出格式 Input/output 输入格式:键盘输入p.q,1≤p≤q≤50 输出格

质因数分解的rho以及miller-rabin

一.前言 质因数分解,是一个在算法竞赛里老生常谈的经典问题.我们在解决许多问题的时候需要用到质因数分解来辅助运算,而且质因数分解牵扯到许许多多经典高效的算法,例如miller-rabin判断素数算法,rho启发式搜索质因数分解算法等.在此文里,我要介绍的就是miller-rabin算法以及rho启发式搜索分解算法. 二.算术基本定理 首先,我们得知道,任意一个大于1的自然数都可以分解为有限个质数的乘积.这里因子均为质数,且为正整数.我们把这样的分解成为N的标准分解式.关于算数基本定理的应用有许多

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

数论-算术基本定理

算术基本定理又叫唯一因子分解定理,算术基本定理的表述如下: 任何一个大于1的自然数 N,如果N不为质数,那么N可以唯一分解成有限个质数的乘积 ,这里P1<P2<P3......<Pn均为质数,其中指数ai是正整数.这样的分解称为 N 的标准分解式. 在进行证明这个定理之前,先说一个关于素数整除性的一个基本而重要的事实. 欧几里得引理:对所有的素数p和所有整数a,b,如果p|ab,则p|a,或p|b.即:如果一个素数整除两个正整数的乘积,那么这个素数可以至少整除这两个正整数中的一个.如果

质素与密码

ps:今天在一个社交软件上认识了一个朋友,在聊天过程了谈到过质素于密码的关系,所以上网搜索些许资料,进行补充个人知识库. 在本世纪七十年代,有几位美国数学家提出一种编码方法,这种方法可以把通讯双方的约定公开,然而却无法破译密码,这种奇迹般的密码就与素数有关(RSA加密算法). 我们知道,任何一个自然数都可以分解为素数的乘积,如果不计因数的次序,分解形式是唯一的.这叫做算术基本定理(欧几里得早已证明).可是将一个大整数分解却没有一个简单通行的办法,只能用较小的素数一个一个去试除,耗时极大.如果用电

欧几里德算法和唯一分解定理

刘汝佳<入门经典>上提供了一道经典的题目: 除法表达式,在NYOJ上可以找到原题,题号1013 描述 给出一个这样的除法表达式:X1/X2/X3/···/Xk,其中Xi是正整数.除法表达式应当按照从左到右的顺序求和,例如表达式1/2/1/2值为1/4.但是可以在表达式中嵌入括号以改变计算顺序,例如表达式(1/2)/(1/2)的值为1. 输入 首先输入一个N,表示有N组测试数据, 每组数据输入占一行,为一个除法 表 达式,输入保证合法. 使表达式的值为整数.k<=10000,Xi<=