JZOJ 3885. 【长郡NOIP2014模拟10.22】搞笑的代码
Description
在OI界存在著一位傳奇選手——QQ,他總是以風(fēng)格迥異的搞笑代碼受世人圍觀
某次某道題目的輸入是一個排列,他使用了以下偽代碼來生成數(shù)據(jù)
while 序列長度< n do
{
隨機生成一個整數(shù)屬亍[1,n]
如果這個數(shù)沒有出現(xiàn)過則加入序列尾
}
聰明的同學(xué)一定發(fā)現(xiàn)了,這樣生成數(shù)據(jù)是徆慢的,那么請你告訴QQ,生成一個n排列的期望隨機次數(shù)
Input
一個正整數(shù)n,表示需要生成一個n排列
Output
一個數(shù)表示期望隨機次數(shù),保留整數(shù)
Sample Input
4
Sample Output
8(.333333…)
【友情提示】
輸出樣例的括號里表示答案的小數(shù)部分,但實際丌要求輸出
數(shù)學(xué)期望=sigma(概率* 權(quán)值),本題中為期望隨機次數(shù)=sigma(概率*隨機次數(shù))
Data Constraint
30%數(shù)據(jù)滿足 n≤3
80%數(shù)據(jù)滿足 n≤107
100%數(shù)據(jù)滿足 n≤231
Solution
這題是經(jīng)典的概率期望題。
定義 fi 表示 序列長度為 i 時的期望隨機次數(shù),不難根據(jù)題目的定義列出遞推式:fi=in?(fi+1)+n?in?(fi?1+1)
解得:
fi=fi?1+nn?i所以答案就是:
∑i=1nni但然而數(shù)據(jù)范圍很大,單純的 O(N) 處理是會超時的。
于是兩個“高深”的算法便橫空出世了!
- 打表!!!——每隔 107 打一個數(shù),暴力處理!~
運用 歐拉常數(shù) 與 調(diào)和級數(shù) 處理,在 N 很大時誤差極小;
之后在 N≤107 時同樣暴力處理即可。
具體公式為:
Ans=logeN?Euler?N
Code
#include<cstdio> #include<cmath> using namespace std; const double Euler=0.57721566490153286060651209; int n; double ans; int main() {scanf("%d",&n);if(n>1e7) ans=log(n)+Euler; elsefor(int i=1;i<=n;i++) ans+=1.0/i;printf("%.0lf",n*ans); }總結(jié)
以上是生活随笔為你收集整理的JZOJ 3885. 【长郡NOIP2014模拟10.22】搞笑的代码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JZOJ 3886. 【长郡NOIP20
- 下一篇: JZOJ 1251. 收费站