小 n 最近學習了位運算,她發現2個數xor之後數的大小可能變大也可能變小,and之後都不會變大,or之後不會變小。於是她想算出以下的期望值:現在有n 個數排成一排, 如果她隨意選擇一對 l,
r並將下標在
l 和
r中間(包括
l ,
r)的數(xor,and,or)之後,期望得到的值是多少呢?取出每一對l,
r 的概率都是相等的。小 g 認為這太 easy 了【這太imba了】,容易被你們水過去,因此你需要告訴他所有選擇情況下,(xor,and,or)值的和。
第一行1個正整數n 。
第二行n
個非負整數代表數列。
共兩行六個數。 第一行3個數,分別表示xor的期望,and的期望,or的期望,保留3位小數。 第二行3個數,分別表示xor的和,and的和,or的和。
24 5
2.750 4.250 4.75011 17 19
30%資料中1≤n≤1000
對於另外的30%資料數列中只包含0和1
對於100%的資料1≤
n≤100000
,數列中的數≤10
9
l, r演算法一xorand
or1,144
41,214
52,114
52,255
5 每一組l,
r 取的概率都是相同的,xor=(4+1+1+5)/4=2.750。其他同理 。
對於前30%資料,考慮暴力列舉
l 後掃到
r並統計答案,期望則是每種運算的和除以n^2,時間複雜度o(
n2) ,期望得分30分。
演算法二對於只包含0和1的數列,考慮三種運算的性質。
對於xor運算
對於and運算
對於or運算
時間複雜度o(
n),期望得分30分。
結合演算法一,期望得分60分。
演算法三其實出題人已經指了一條明路。容易發現,可以對數列中的數的二進位制表示的每一位分別做演算法二。因為xor,and,or這些運算分別為按位運算,各數字之間無影響。
時間複雜度o(
32n) ,期望得分100分。
上**。
#include
#include
#include
using
namespace
std;
struct oneeven[50001], odd[50001];
//從0開始序號為偶數和奇數的1
long
long n, arr[100002], l1, l2, l3, a1, a2, a3, sufe[50000], sufo[50000];
//n,數列,當前位三種運算和,總和,序號為偶和奇的1的back字尾和
int main()
}cnt--;
sufe[cnt>>1]=even[cnt>>1].back;
for(int i=(cnt>>1)-1;~i;i--)
sufe[i]=sufe[i+1]+even[i].back;
for(int i=0;i<=(cnt>>1);i++)
l1+=even[i].fore*sufe[i];
if(cnt&1)
else
//同樣注意cnt的奇偶
(l1*=2)-=cnt;
l3=n*n-l3;
long
long ones=0; arr[n]=0;
for(int i=0;i<=n;i++)
//統計and和
a1+=l1}
printf("%.3lf %.3lf %.3lf\n%lld %lld %lld\n", double(a1)/(n*n), double(a2)/(n*n), double(a3)/(n*n), a1, a2, a3);
return
0;}
按位處理好強。 NOIP模擬賽 書 數學 期望概率
biubiu 對於這道傻題.我考場上退了乙個多小時才推出來這個東西是排列.然後我打的dfs效率n loginf正好n 9是最後乙個能過的數結果前三個點的n全是10,然後這題全場爆零.我在考場上試了很多種方法發現只有排列可以對樣例.解釋一下為什麼,乙個數自己對自己的位置造成影響的只有最後一次操作,而這...
2020 8 23NOIP模擬賽 數學 失落
題目描述 出題人心情很失落,於是他直接告訴你讓你求出乙個集合中所有數所不能湊出來的最小的數是多少。輸入格式 第一行乙個整數nnn。第二行n nn個整數a ia i ai 輸出格式 乙個整數表示答案。輸入輸出樣例 輸入 1 3 5 1 2 輸出 14說明 提示 對於30 30 30 的資料,滿 n 1...
憤怒的巨巨(數學期望)
題目描述 在511沒人敢惹盼成巨巨,因為盼成巨巨是我們511的學神!週末,巨巨讓乙超大佬去買一根香蕉,可你是知道的,買來的香蕉很可能是壞的,經過乙超大佬的長期調研,源源家香蕉中次品率為p,因為乙超超byq too you qian 如果買到壞香蕉,他會認栽,但他害怕巨巨憤怒,他會繼續買下去,直到買到...