Content

求给定 \(x,n\),求 \(f(x,n)=\sqrt{n+\sqrt{(n-1)+\sqrt{(n-2)+\sqrt{\dots+2+\sqrt{1+x}}}}}\) 的值。

Solution

乍一看这题目很烦人,其实,如果我们可以转换一下,这道题目就很简单。

我们不妨算下:

\[\begin{aligned}f(x,1)&=\sqrt{1+x}\\f(x,2)&=\sqrt{2+\sqrt{1+x}}=\sqrt{2+f(x,1)}\\f(x,3)&=\sqrt{3+\sqrt{2+\sqrt{1+x}}}=\sqrt{3+f(x,2)}=\sqrt{3+\sqrt{2+f(x,1)}}\\&\vdots\end{aligned}
\]

然后我们可以发现,\(f(x,n)\) 是一个层层包含的递归关系:如果 \(n=1\),那么 \(f(x,n)=\sqrt{1+x}\),否则,\(f(x,n)=\sqrt{n+f(x,n-1)}\),于是就这么样递归下去然后向上累加答案,足够通过本题。

然而,如果 \(n\) 的范围很大,递归的层数很多,我们如果还用递归的话就会内存爆炸,那么怎么办呢?我们考虑把它转为一个递推公式:

\[f_{x,n}=\begin{cases}\sqrt{1+x}&n=1\\\sqrt{n+f_{x,n-1}}&n>1\end{cases}
\]

然后你就可以明白了,这不就可以用数组直接循环递推出来就可以了吗?你可能发现了第一维的 \(x\),然后你注意到题目中 \(x\) 是个实数,那么就不能够以它作为数组的第一维,那么怎么办?我们又发现,\(n>1\) 时,\(f_{x,n}\) 只和 \(n\) 和 \(f_{x,n-1}\) 有关,并不和 \(x\) 有关。所以我们考虑直接将第一维省去,得到:

\[f_n=\begin{cases}\sqrt{1+x}&n=1\\\sqrt{n+f_{n-1}} &n>1\end{cases}
\]

然后你就可以用递推通过本题了。

Code

1 递归

#include <cstdio>
#include <cmath>
using namespace std; inline double f(double x, int n) {
if(n > 1) return sqrt(n + f(x, n - 1));
else return sqrt(1 + x);
} int main() {
double x; scanf("%lf", &x);
int n; scanf("%d", &n);
return printf("%.2lf", f(x, n)), 0;
}

2 递推

#include <cstdio>
#include <cmath>
using namespace std; int main() {
double x; scanf("%lf", &x);
int n; scanf("%d", &n);
double f[10007] = {0.0}; f[1] = sqrt(1 + x);
F(int, i, 2, n) f[i] = sqrt(i + f[i - 1]);
return printf("%.2lf", f[n]), 0;
}

LuoguB2147 求 f(x,n) 题解的更多相关文章

  1. hdu 1588 求f(b) +f(k+b) +f(2k+b) +f((n-1)k +b) 之和 (矩阵快速幂)

    g(i)=k*i+b; 0<=i<nf(0)=0f(1)=1f(n)=f(n-1)+f(n-2) (n>=2)求f(b) +f(k+b) +f(2*k+b) +f((n-1)*k + ...

  2. ACM_求f(n)

    求f(n) Time Limit: 2000/1000ms (Java/Others) Problem Description: 设函数f(n)=1*1*1+2*2*2+3*3*3+...+n*n*n ...

  3. Codeforces Round #624 (Div. 3) F. Moving Points 题解

    第一次写博客 ,请多指教! 翻了翻前面的题解发现都是用树状数组来做,这里更新一个 线段树+离散化的做法: 其实这道题是没有必要用线段树的,树状数组就能够解决.但是个人感觉把线段树用熟了会比树状数组更有 ...

  4. LuoguP5139 z小f的函数 题解

    Content 给定 \(T\) 个二次函数 \(y=ax^2+bx+c\),有若干次操作,有一个操作编号 \(p\),保证仅为以下这五种: 操作 \(1\):给定 \(k\),将函数图像向上移动 \ ...

  5. HDU X mod f(x)(题解注释)

    X mod f(x) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  6. 2018年第九届蓝桥杯【C++省赛B组】B、C、D、F、G 题解

    B. 明码 #STL 题意 把每个字节转为2进制表示,1表示墨迹,0表示底色.每行2个字节,一共16行,布局是: 第1字节,第2字节 第3字节,第4字节 .... 第31字节, 第32字节 给定一段由 ...

  7. F. Mattress Run 题解

    F. Mattress Run 挺好的一道题,对于DP的本质的理解有很大的帮助. 首先要想到的就是将这个拆成两个题,一个dp光求获得足够的夜晚的最小代价,一个dp光求获得足够的停留的最小代价. 显然由 ...

  8. 合肥学院ACM集训队第一届暑假友谊赛 B FYZ的求婚之旅 D 计算机科学家 F 智慧码 题解

    比赛网址:https://ac.nowcoder.com/acm/contest/994#question B FYZ的求婚之旅 思路: 然后用快速幂即可. 细节见代码: #include <i ...

  9. 一本通1166 求f(x,n)

    [题目描述] 已知 计算x=4.2,n=1以及x=2.5,n=15时f的值. [输入] 输入x和n. [输出] 函数值,保留两位小数. [输入样例] 4.2 10 [输出样例] 3.68 1.看见这种 ...

随机推荐

  1. Qt5 connect 重载信号和槽

    转载文章超哥的经验之谈---Qt5 connect使用之"重载信号和槽" 在Qt4中,关联信号与槽是要使用到SIGNAL()和SLOT()这两个宏. QLabel *label = ...

  2. Codeforces 1276F - Asterisk Substrings(SAM+线段树合并+虚树)

    Codeforces 题面传送门 & 洛谷题面传送门 SAM hot tea %%%%%%% 首先我们显然可以将所有能够得到的字符串分成六类:\(\varnothing,\text{*},s, ...

  3. 一类利用队列优化的DP

    I.导入: 这是一个\(O(n^2)\)的状态和转移方程: \[f(i,j)=\left\{ \begin{aligned} f(i-1,j-1)+k \ (1\leq j)\\ \max_{k \i ...

  4. C语言 指针数组指针

    指向指针数组的指针. 1 #include <stdio.h> 2 3 int main(void) 4 { 5 char *pa[4]={"aaaaa"," ...

  5. 67-Gray Code

    Gray Code My Submissions QuestionEditorial Solution Total Accepted: 60277 Total Submissions: 165212 ...

  6. Linux实现批量添加用户及随机密码小脚本

    通过chpasswd命令可实现迅速为用户批量设置密码     实例:写一个脚本,实现批量添加20个用户user1-20,密码为用户名和后面跟5个随机字符 #!/bin/sh # 思路:通过for循环, ...

  7. C# / VB.NET 在Word中嵌入多媒体(视频、音频)文件

    Word中可将Office(Word/Excel/PowerPoint).PDF.txt等文件作为OLE对象插入到文档中,双击该对象可直接访问或编辑该文件,除了以上常见的文件格式对象,也可以插入多媒体 ...

  8. 强化学习实战 | 表格型Q-Learning玩井字棋(一)

    在 强化学习实战 | 自定义Gym环境之井子棋 中,我们构建了一个井字棋环境,并进行了测试.接下来我们可以使用各种强化学习方法训练agent出棋,其中比较简单的是Q学习,Q即Q(S, a),是状态动作 ...

  9. Maven打包及场景

    场景一 对当前项目打包并指定主类. <build> <plugins> <plugin> <artifactId>maven-compiler-plug ...

  10. nodejs-Child Process模块

    JavaScript 标准参考教程(alpha) 草稿二:Node.js Child Process模块 GitHub TOP Child Process模块 来自<JavaScript 标准参 ...