未完待續 NOI2017模擬 大新聞

2021-08-04 02:45:36 字數 3338 閱讀 7744

題目背景

2016.05.19 t1

題目描述

記者弄了個大新聞,這個新聞是乙個在 [0,n) 內等概率隨機選擇的整數,記其為 x 。為了盡可能消除這個大新聞對公眾造成的不良印象,我們需要在 [0,n) 內找到某乙個整數 y ,使得 x⊕y 達到最大值。這裡 ⊕ 代表異或。

問題在於,記者有可能對大新聞進行了加密。情報顯示,大新聞沒有被加密的概率為 p 。我們決定採取這樣的策略:如果大新聞沒有被加密,那麼我們選出使得 x⊕y 最大的 y ;否則,我們在 [0,n) 內等概率隨機選擇乙個整數作為 y 。

請求出 x⊕y 的期望值。

輸入格式

輸入僅包含一行,其中有乙個正整數 n 和乙個實數 p ,含義如問題描述中所述。p 至多精確到小數點後六位。

輸出格式

輸出一行,代表 x⊕y 的期望值。只有當你的輸出與標準輸出的相對誤差不超過 10^5 時,你的輸出才會被判為正確。建議保留至少六位小數。

樣例資料1

輸入 3 0.5

輸出 2.000000

樣例資料2

輸入 123456 0.5

輸出 98063.674346

備註

【樣例解釋】

考慮樣例一。如果大新聞沒有被加密,那麼可能的 x 與對應的 y 的取值如下:

此時的期望值為 8/3。

如果大新聞被加密了,那麼可能的 x 和 y 的取值如下:

此時的期望值為 12/9 = 4/3。

所以總的期望值為 2 。

【資料規模與約定】

所有測試點的資料規模如下:

對於全部測試資料,1≤n≤10^18。

分析:50%:對於前十個點p=0或1十分有特殊性,n<=100時,不妨直接暴力;n=2^k時,若p=0,期望為(2^k-1)/2,若p=1,期望為2^k-1,這兩個是很好推的;至於後面的大資料,不妨做一名mo法師[滑稽。

100%:暫時看著吧……(假裝看懂了的樣子)

50%(本人考場作)

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

int getint()

for(;ch>='0'&&ch<='9';ch=getchar())

sum=(sum<<3)+(sum<<1)+ch-48;

return sum*f;

}long

long getlong()

for(;ch>='0'&&ch<='9';ch=getchar())

sum=(sum<<3)+(sum<<1)+ch-48;

return sum*f;

}const

double eps=0.000000001;

int mx[110];

bool bj;

long

long n,ans1,mi[65];

double ans;

double p;

int main()

for(int i=1;i<=60;++i)

}if(fabs(p-1)if(bj==1)

else

if(n<=100)

else

//n<=10^18

}else

if(fabs(p-0)if(n<=100)

else

if(bj==1)

else

//n<=10^18

}else

//0<=p<=1

return

0;}

100%(膜hyj大佬orz,就他乙個ac了),暫時看著吧……(繼續假裝看懂了的樣子)

#include 

using

namespace

std;

long

long n;

double p;

double ans1, ans2, pi[65], ans;

long

long pow1[65];

int bit[65], cnt;

long

double f[65][2][2], g[65][2][2];

int main ()

int up = log2(n);

cout

<< setiosflags(ios::fixed) << setprecision(6);

// cout<

long i = 0; i <= up; ++i)

for (int i = 0; i <= up; ++i)

long

long t = n - 1;

for (; t; t >>= 1)bit[++cnt] = t & 1;

f[cnt][0][1] = f[cnt][1][0] = pow1[cnt - 1];

g[cnt][0][1] = g[cnt][1][0] = 1;

int nxtj, nxtk;

long

long nxtans;

for (int i = cnt ; i ; --i) }}

}for (int i = 0 ; i < 2; ++i)

}ans += ans1 * (1 - p) + ans2;

cout

<< ans << '\n';

}

本題結?no!no!no!沒弄懂怎麼能叫結呢?

NOI2017模擬6 29 呵呵

考慮乙個特定形態的樹的貢獻,設點i的度數為d i 那麼答案就是 wdii?di 考慮prufer序,乙個度數為d i 的點出現的次數是d i 1,那麼就可以得到乙個很顯然的dp,f i j 表示前i個點的度數為i j fi,j d 0jfi?1,j?d?dn?2?j?d wd 1i?d 1 這個dp...

noi2017 整數 線段樹or模擬

orzyyb 題目大意 你需要維護乙個有 3 times 10 7 個二進位制位的數,有一種修改方式和一種詢問方式 對這個數加上 a times2 b 其中 a 10 9 b 3 times 10 7 保證需要維護的這個數始終非負 詢問這個數第k個二進位制位的值 總共有 10 6 次詢問 修改操作 ...

noi2017 整數 線段樹or模擬

orzyyb 題目大意 你需要維護乙個有 3 times 10 7 個二進位制位的數,有一種修改方式和一種詢問方式 對這個數加上 a times2 b 其中 a 10 9 b 3 times 10 7 保證需要維護的這個數始終非負 詢問這個數第k個二進位制位的值 總共有 10 6 次詢問 修改操作 ...