(数论)数的计算

题目描述 Description

我们要求找出具有下列性质数的个数(包含输入的自然数n):

先输入一个自然数n(n<=1000),然后对此自然数按照如下方法进行处理:

1.          不作任何处理;

2.          在它的左边加上一个自然数,但该自然数不能超过原数的一半;

3.          加上数后,继续按此规则进行处理,直到不能再加自然数为止.

输入描述 Input Description

一个数n

输出描述 Output Description

满足条件的数的个数

样例输入 Sample Input

6

样例输出 Sample Output

6

数据范围及提示 Data Size & Hint

6个数分别是:

6

16

26

126

36

136

分析:

1. 本题难度看似不大,但如果用递归来做的话耗时非常大,因为需要重复计算的数据量太大了。当然我们也可以采取一边递归一边储存的方法,但计算量也还是不小,再进一步思考,实际上就是可以用如下的递推法来做;
    2. 例如要求f(6),经过分析,我们知道:f(6)=f(1)+f(2)+f(3)+1,也就是说,f(6)的答案数量是在它之前可以取的所有自然数的答案数量之和(6之前可以取1,2,3三个自然数),最后加1是指数字6本身也是一个答案;
    3. 所以,我们可以知道f(n)=f(1)+f(2)+......f(trunc(n/2))+1;
    4. 因此,要求f(n),我们只需用上述公式编一个递推过程,把f(2)到f(n)全部求出即可,对于f(1000)也不超过1秒就能得到结果。
    第二种算法:
    1. 对于f(7)=f(6)是显而易见的,也即f(2n+1)=f(2n)。那么,f(8)和f(7)之间有什么关系呢?
    2. 分析可知:f(8)和f(7)的差别是,f(8)除了包含f(7)的所有情况外,还要多加上f(4),即:f(8)=f(7)+f(4)。因此可得:f(2n)=f(2n-1)+f(n)。只需据此编一个递归小过程或者用递推方法即可。

 1 #include <iostream>
 2 using namespace std;
 3 int main()
 4 {
 5     int i,n,ans,sum[1001];
 6     sum[0] = 0,sum [1] = 1;
 7     cin>>n;
 8     for(i = 2 ; i <= n ; i++)
 9     {
10         ans = sum[i/2] + 1;
11         sum [i] = sum[i-1] + ans;
12     }
13     cout<<sum[n] - sum[n-1]<<endl;
14     return 0;
15 }

时间: 2024-10-20 11:25:29

(数论)数的计算的相关文章

数式计算(递归解法)

1 /** 2 *注:1.有一个bug(以及未知什么bug) 我已知的是: ([email protected])(ps:@为运算符),这种带括号的表达式不能单独的出现,否则异常退出,,但是只要([email protected])@n 3 4 带括号的表达式出现任意+,-,*,/的运算都能进行正常运算(前面 [email protected]([email protected])也不可以)...不知道为什么()表达式后面没有操作时会异常退出. 5 *不知道如何解决.希望感兴趣的人帮帮忙! 6

6.数的计算(递归算法)

数的计算(递归算法) 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题解 查看运行结果 题目描述 Description 我们要求找出具有下列性质数的个数(包含输入的自然数n): 先输入一个自然数n(n<=1000),然后对此自然数按照如下方法进行处理: 1.          不作任何处理; 2.          在它的左边加上一个自然数,但该自然数不能超过原数的一半; 3.          加上数后,继续按此规则进行处理,直到不能再加自然数为止.

luogu P1028 数的计算 x

P1028 数的计算 题目描述 我们要求找出具有下列性质数的个数(包含输入的自然数n): 先输入一个自然数n(n<=1000),然后对此自然数按照如下方法进行处理: 1.不作任何处理; 2.在它的左边加上一个自然数,但该自然数不能超过原数的一半; 3.加上数后,继续按此规则进行处理,直到不能再加自然数为止. 输入输出格式 输入格式: 一个自然数n(n<=1000) 输出格式: 一个整数,表示具有该性质数的个数. 输入输出样例 输入样例#1: 6 输出样例#1: 6 说明 满足条件的数为 6,1

Hadoop中map数的计算

转载▼ Hadoop中在计算一个JOB需要的map数之前首先要计算分片的大小.计算分片大小的公式是: goalSize = totalSize / mapred.map.tasks minSize = max {mapred.min.split.size, minSplitSize} splitSize = max (minSize, min(goalSize, dfs.block.size)) totalSize是一个JOB的所有map总的输入大小,即Map input bytes.参数map

ACM——数的计算

数的计算——(递归(超时)和非递归) 时间限制(普通/Java):1000MS/3000MS          运行内存限制:65536KByte总提交:1050            测试通过:312 描述 要求找出具有下列性质数的个数(包含输入的自然数n):先输入一个自然数n(n<=1000),然后对此自然数按照如下方法进行处理:1. 不作任何处理;2. 在它的左边加上一个自然数,但该自然数不能超过原数的一半;3. 加上数后,继续按此规则进行处理,直到不能再加自然数为止. 输入 一个自然数n

HOG参数简介及Hog特征维数的计算(转)

HOG构造函数 CV_WRAP HOGDescriptor() :winSize(64,128), blockSize(16,16), blockStride(8,8),      cellSize(8,8),nbins(9), derivAperture(1), winSigma(-1), histogramNormType(HOGDescriptor::L2Hys),L2HysThreshold(0.2), gammaCorrection(true), nlevels(HOGDescript

fpga中有符号数的计算

在fpga设计中,所有的算数运算符都是按照无符号数进行的.最近用FPGA做了有符号的计算,来记录一下 1.如果要完成有符号数计算,对于加.减操作通过补码处理即可用无符号加法完成.不过在计算的时候要考虑位数的限制,不管在做加法还是减法,结果的位数要比原来的数据多出一位, 这样计算的时候才不会出现量程的错误. example1: module signed_yz( input clk,rst_n, input signed [7:0]data, input signed [7:0]datb, out

java 日期加减天数、月数、年数的计算方式

因为某个项目需要统计 近1周.近1个月.近6个月 等数据,所以在时间的加减上面想了很多方式,最后决定用java.util.Calendar java.util.Calendar ,提供了计算时间的方式, Calendar.DATE  : 代表天数 Calendar.WEDNESDAY: 代表周数 Calendar.MONTH : 代表月数 Calendar.YEAR :代表年数 具体计算方式如下: 1. 计算近一周的日期,也就是得出过去7天的时间段,如今天2015-07-21  ,一个星期前那就

1011数的计算

1011 数的计算 2001年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题解 题目描述 Description 我们要求找出具有下列性质数的个数(包含输入的自然数n): 先输入一个自然数n(n<=1000),然后对此自然数按照如下方法进行处理: 1.          不作任何处理; 2.          在它的左边加上一个自然数,但该自然数不能超过原数的一半; 3.          加上数后,继续按此规则进行处理,直到不能