題目背景
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 次詢問 修改操作 ...