M1MisakaMikoto
Articles11
Tags0
Categories2

Categories

Archive

2023-10-29-LearningRecord

2023-10-29-LearningRecord

刷题Day001

 
 

题目一

[NOIP2002 普及组] 级数求和

题目描述

已知:。显然对于任意一个整数 ,当 足够大的时候,

现给出一个整数 ,要求计算出一个最小的 ,使得

输入格式

一个正整数

输出格式

一个正整数

样例 #1

样例输入 #1

1
1

样例输出 #1

1
2

提示

【数据范围】

对于 的数据,

【题目来源】

NOIP 2002 普及组第一题

暴力解法:

1
2
3
4
5
6
7
8
9
10
11
int main() {
int k;
scanf("%d", &k);
double SUM = 0;
int n = 0;
while (SUM < k) {
SUM += 1.0 / ++n;
}
cout << n;
return 0;
}

更优的解-数论(调和级数):

▶调和级数讲解
已知
欧拉推导过求调和级数有限多项和的表达式为 ()
因为题目要求满足的条件是 化简得
因此只需求 并向上取整即可

1
2
3
4
5
6
7
8
9
10
11
12
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<math.h>
using namespace std;

int main() {
int k;
scanf("%d", &k);
int n = exp((double)k - 0.5772156649) + 0.5;
cout << n;
return 0;
}

ps:我不知道为什么 - 1改成 +0.5然后去小数刚好是正确答案 希望有人能解答一下QAQ

Author:M1MisakaMikoto
Link:http://m1misakamikoto.github.io/2023/10/29/2023-10-29-LearningRecord/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可