洛谷 U140600 反正切命题

洛谷 U140600 反正切命题

洛谷传送门

题目背景

SeawaySeawa**y对之前的NOIP2020NOI**P2020模拟赛进行了细致而认真的反思。作为出题人,他觉得自己的题目非常容易让选手现场切题。为此,他进行了认真的研究,最终确定了新的命题方向:反正切命题。

为了更好地掌握反正切命题,SeawaySeawa**y决定先去研究一种函数:反正切函数。

题目描述

在数学的海洋里,SeawaySeawa**y了解到:

反正切函数不止可像高中数学课本那样计算。与一般的离散型函数相同,反正切函数也可展开成无穷级数,有如下公式:

arctan(x) = sum_{n = 0}^infty frac{(-1) ^ n x ^ {2n + 1}}{2n + 1} ( 0 le x le 1 ) ag{1}arctan(x)=n=0∑∞2n+1(−1)n**x2n+1(0≤x≤1)(1)

这样,反正切函数的计算就可以方便地被表示:例如,最简单的计算的方法:

egin{aligned} pi & = 4 arctan(1) & = 4(1 - frac{1}{3} + frac{1}{5} - frac{1}{7} + frac{1}{9} - frac{1}{11} + dots) end{aligned} ag{2}π=4arctan(1)=4(1−31+51−71+91−111+…)(2)

然而,可以看出,这种方法的效率很低,于是我们可以采用高中数学所学习的三角形和差角公式对其计算过程进行优化:

an(alpha + eta) = frac{ an(alpha) + an(eta)}{1 - an(alpha) an(eta)} ag{3}tan(α+β)=1−tan(α)tan(β)tan(α)+tan(β)(3)

通过简单的变换得到:

arctan(p) + arctan(q) = arctan(frac{p + q}{1 - p q}) ag{4}arctan(p)+arctan(q)=arctan(1−pqp+q)(4)

利用这个公式,令p = frac{1}{2}, q = frac{1}{3}p=21,q=31,则frac{p + q}{1 - p q} = 11−pqp+q=1,有:

arctan(frac{1}{2}) + arctan(frac{1}{3}) = arctan(frac{frac{1}{2} + frac{1}{3}}{1 - frac{1}{2} cdot frac{1}{3}}) = arctan(1)arctan(21)+arctan(31)=arctan(1−21⋅3121+31)=arctan(1)

这样,我们就快速地计算出了11的反正切函数。

我们将公式44写成如下形式:

arctan(frac{1}{a}) = arctan(frac{1}{b}) + arctan(frac{1}{c})arctan(a1)=arctan(b1)+arctan(c1)

其中a, b, c in mathbb{N^+}a,b,c∈N+。

我们的问题是:对于每一个给定的 aa,求b + cb+c 的值。我们保证对于任意的aa都存在整数解。如果有多个解,要求你给出b + cb+c最小的解。

输入格式

从文件arctan.inarcta**n.i**n中读入数据。

一行一个整数aa

输出格式

输出到文件arctan.outarcta**n.out中。

一行一个整数ans=b+cans=b+c


命题背景:

爆你妈破啊爆破。

一场考试进行到一半

咕掉了T1

原因是因为爆破。

CNM(组合数)


题解:

前面就是一群废话,稍微有空读读题就能明白第一题多水。

谁见过考枚举的?

这回就考了。天上掉馅饼还不知道乐

毒NM瘤,爆NM破,

有理了这还?

代码:

#include<cstdio>
#define int long long
using namespace std;
int a,b,ans;
signed main()
{
	scanf("%lld",&a);
	for(b=a+1;b*(b-a)<=a*b+1;b++)
		if((b*b+1ll)%(b-a)==0)
			ans=(b*b+1ll)/(b-a);
	printf("%lld
",ans);
	return 0;
}
原文地址:https://www.cnblogs.com/fusiwei/p/13994437.html