1. 程式人生 > 實用技巧 >洛谷 U140600 反正切命題

洛谷 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 )\tag{1}arctan(x

)=n=0∑∞2n+1(−1)n**x2n+1(0≤x≤1)(1)

這樣,反正切函式的計算就可以方便地被表示:例如,最簡單的計算的方法:

\begin{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} \tag{2}π=4arctan(1)=4(1−31+51−71+91−111+…)(2)

然而,可以看出,這種方法的效率很低,於是我們可以採用高中數學所學習的三角形和差角公式對其計算過程進行優化:

\tan(\alpha + \beta) = \frac{\tan(\alpha) + \tan(\beta)}{1 - \tan(\alpha) \tan(\beta)} \tag{3}tan(α+β)=1−tan(α)tan(β)tan(α)+tan(β)(3)

通過簡單的變換得到:

\arctan(p) + \arctan(q) = \arctan(\frac{p + q}{1 - p q}) \tag{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−pq

p+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\n",ans);
	return 0;
}