您的位置:首页 > 编程语言

【长郡NOIP2014模拟10.22】搞笑的代码

2017-01-19 21:05 253 查看

Description

在OI界存在着一位传奇选手——QQ,他总是以风格迥异的搞笑代码受世人围观

某次某道题目的输入是一个排列,他使用了以下伪代码来生成数据

while 序列长度

Input

一个正整数n,表示需要生成一个n排列

Output

一个数表示期望随机次数,保留整数

Sample Input

4

Sample Output

8(.333333…)

【友情提示】

输出样例的括号里表示答案的小数部分,但实际丌要求输出

数学期望=sigma(概率×权值),本题中为期望随机次数=sigma(概率×随机次数)

Data Constraint

30%数据满足n≤3

80%数据满足n≤10^7

100%数据满足n≤2^31

Solution

设x为当前到第i位取到可以取的值的期望次数

设共有n个数(即输入的n)

x=n−i+1n+i−1n∗(x+1)

化简得

x=nn−i+1=n∗1i

用最右边的等式,把n提出来,答案为

n∗∑i=1n1i

把∑ni=11i每隔107打个表,然后暴力就行了

Code

#include<cstdio>
#define ll long long
#define fo(i,a,b) for(ll i=a;i<=b;i++)
#define db double
#define N 10000010
using namespace std;
db a[215]={0,
16.695311365860,
17.388458521420,
17.793923621195,
18.081605689480,
18.304749238294,
18.487070793421,
18.641221472058,
18.774752863789,
18.892535898751,
18.997896413853,
19.093206593203,
19.180217969814,
19.260260677167,
19.334368649046,
19.403361520295,
19.467900041224,
19.528524662856,
19.585683076533,
19.639750297657,
19.691043591913,
19.739833755963,
19.786353771490,
19.830805533962,
19.873365148290,
19.914187142727,
19.953407855803,
19.991148183715,
20.027515827820,
20.062607147570,
20.096508699188,
20.129298521957,
20.161047220221,
20.191818878841,
20.221671841946,
20.250659378777,
20.278830255704,
20.306229229854,
20.332897476901,
20.358872963271,
20.384190771223,
20.408883383783,
20.432980935333,
20.456511432715,
20.479500950913,
20.501973806740,
20.523952713435,
20.545458918633,
20.566512327808,
20.587131614990,
20.607334322287,
20.627136949563,
20.646555035402,
20.665603230354,
20.684295363349,
20.702644502000,
20.720663007487,
20.738362584570,
20.755754327267,
20.772848760612,
20.789655878914,
20.806185180852,
20.822445701710,
20.838446043044,
20.854194399999,
20.869698586523,
20.884966058643,
20.900003935996,
20.914819021770,
20.929417821180,
20.943806558622,
20.957991193604,
20.971977435569,
20.985770757692,
20.999376409738,
21.012799430062,
21.026044656803,
21.039116738362,
21.052020143189,
21.064759168959,
21.077337951158,
21.089760471148,
21.102030563733,
21.114151924258,
21.126128115297,
21.137962572937,
21.149658612694,
21.161219435088,
21.172648130905,
21.183947686153,
21.195120986744,
21.206170822925,
21.217099893451,
21.227910809550,
21.238606098661,
21.249188207985,
21.259659507847,
21.270022294877,
21.280278795039,
21.290431166498,
21.300481502347,
21.310431833195,
21.320284129633,
21.330040304574,
21.339702215481,
21.349271666492,
21.358750410442,
21.368140150788,
21.377442543446,
21.386659198546,
21.395791682106,
21.404841517621,
21.413810187600,
21.422699135013,
21.431509764692,
21.440243444657,
21.448901507396,
21.457485251084,
21.465995940748,
21.474434809390,
21.482803059057,
21.491101861869,
21.499332361002,
21.507495671638,
21.515592881867,
21.523625053561,
21.531593223207,
21.539498402711,
21.547341580169,
21.555123720608,
21.562845766699,
21.570508639442,
21.578113238824,
21.585660444456,
21.593151116183,
21.600586094668,
21.607966201962,
21.615292242052,
21.622565001378,
21.629785249349,
21.636953738825,
21.644071206592,
21.651138373812,
21.658155946468,
21.665124615782,
21.672045058624,
21.678917937910,
21.685743902978,
21.692523589961,
21.699257622140,
21.705946610288,
21.712591153005,
21.719191837034,
21.725749237578,
21.732263918597,
21.738736433101,
21.745167323429,
21.751557121526,
21.757906349202,
21.764215518394,
21.770485131405,
21.776715681154,
21.782907651400,
21.789061516973,
21.795177743988,
21.801256790063,
21.807299104517,
21.813305128575,
21.819275295560,
21.825210031078,
21.831109753203,
21.836974872654,
21.842805792963,
21.848602910646,
21.854366615361,
21.860097290068,
21.865795311181,
21.871461048716,
21.877094866432,
21.882697121979,
21.888268167027,
21.893808347401,
21.899318003211,
21.904797468974,
21.910247073740,
21.915667141208,
21.921057989841,
21.926419932981,
21.931753278955,
21.937058331184,
21.942335388283,
21.947584744168,
21.952806688148,
21.958001505023,
21.963169475181,
21.968310874680,
21.973425975345,
21.978515044851,
21.983578346807,
21.988616140835,
21.993628682658,
21.998616224168,
22.003579013508,
22.008517295148,
22.013431309949,
22.018321295242,
22.023187484892,
22.028030109367,
22.032849395801,
22.037645568064,
22.042418846815,
22.047169449573,
22.051897590768,
22.056603481804,
22.061287331115

};
int main()
{
ll n,n1;
scanf("%lld",&n);
n1=n/10000000;
ll ans1=(ll)a[n1];db ans=a[n1]-ans1;
fo(i,n1*10000000+1,n)
{
ans+=1.0/i;
if(ans>1) ans--,ans1++;
}
printf("%.0lf",(ans+ans1)*(db)n);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: