C - Splits

我们定义一个不上升的且和为 n 的正整数序列,叫做 n 的分解.

比如, 下面是8的分解: [4, 4], [3, 3, 2], [2, 2, 1, 1, 1, 1], [5, 2, 1].

而这些则不是8的分解: [1, 7], [5, 4], [11, -3], [1, 1, 4, 1, 1].

一个分解的权值等于第一个数的个数. 例如, [1, 1, 1, 1, 1] 的权值是 5, [5, 5, 3, 3, 3] 的权值是 2, [9] 的权值是 1.

给定一个 n, 找到不同权值的分解的个数.

Input

第一行输入一个整数 n (1 <= n <= 10^9).

Output

输出一个整数 — 即上述问题的答案.

Examples

 1 Input
 2 7
 3 Output
 4 4
 5 Input
 6 8
 7 Output
 8 5
 9 Input
10 9
11 Output
12 5

Note

第一组样例,下面是可能的 7的分解的权值:

权值为 1: [7]

权值为 2: [3, 3, 1]

权值为 3: [2, 2, 2, 1]

权值为 7: [1, 1, 1, 1, 1, 1, 1]

思路

本题就是要求一个数可以分解为不上升的且和为 n 的正整数序列的个数。一开始想的挺复杂的,但后来列举答案的时候,发现了规律,就是如下图:

  n    个数
  1      1
  2      2
  3      2
  4      3
  5      3
  6      4
  7      4
  8      5
  9      5
  10     6
  11     6

怎样,是不是很神奇(・◇・) ,因此,代码如下:

 1 #include<stdio.h>
 2 #define ll long long
 3 
 4 int main()
 5 {
 6     ll n;
 7     scanf("%lld",&n);
 8     printf("%lld\n",n/2+1);
 9     return 0;
10 }

猜你喜欢

转载自www.cnblogs.com/lovelycaier/p/12676475.html
C