#1549 : 或運算和
時間限制:10000ms
單點時限:1000ms
記憶體限制:256mb
給定n個數a1...an (0 <= ai < 220) 和乙個正整數k,我們用ans[i]表示有多少種從這n個數中選取k個數的方案,滿足這k個數的或運算和正好為i。
你能對於每乙個i(0 <= i < 220)都計算出ans[i]的值嗎?
為了簡化輸出,你只需要輸出σ(ans[i] * i) 除以1000000007的餘數。
第一行乙個數t(<=10),表示資料組數
對於每一組資料:
第一行兩個數n,k(1<=n<=100,000,k<=1000)
第二行n個數a1...an (0 <= ai < 220)
乙個數表示答案
樣例輸入
2樣例輸出3 21 2 3
4 21 2 4 5
9 31
//其實,若是理解了,很容易做出來
直接分析答案,
∑(ans[i] * i ) = ∑(ans[i] * (2p1+2p2+2p3+...+2px)) (pi 為互不相同的自然數)
= 20 * (ans[0]+ans[1]+...+ ans[220-1])
+21 * (ans[0]+ans[1]+...+ ans[220-1])
+...
+219 * (ans[0]+ans[1]+...+ ans[220-1])
然後,發現,(ans[0]+ans[1]+...+ ans[220-1])這部分,代表的意思是,n 個數中選 k 個數或出 0 -- 220-1 的種數。選 k 個數不管如何,或出來肯定在 0 - 220-1 之中,所以 2i * (ans[0]+ans[1]+...+ ans[220-1]) 就是 n 個數中,轉二進位制,第 i 位選 k 個或出 1 的種數,然後就簡單的排列組合,求逆元,累加即可。
或者簡單的撕拷,選 k 個數,組成了一種 i ,i 是由 (2p1+2p2+2p3+...+2px)組成,答案中就包含了這部分,所以,找到所有選 k 個數可以讓 x (0-19)位變為 1 的種數,再乘以權值,即為答案,其實這就是算貢獻,還得好好練啊!
1 # include 2 # include 3 # include 4 # include 5 # include 6 # include 7 # include 8 # include 9 # include 10 # includeview code11 # include 12 # include 13
using
namespace
std;
14#define lowbit(x) ((x)&(-x))
15#define pi acos(-1.0)
16#define eps 1e-8
17#define mod 1000000007
18#define inf 0x3f3f3f3f
19#define ll long long
20 inline int
scan()
23while(ch>='
0'&&ch<='9')
24return x*f;25}
26 inline void out(int
a) 28
if(a>=10) out(a/10
);29 putchar(a%10+'0'
);30}31
#define mx 100005
32//
code begin...
33int
n,k;
34int
a[mx];
3536
ll qk_mi(ll x,ll y)
3745
return
res;46}
4748 ll c(ll x,ll y)//
m n
4963
64 ll slove(int x,int
y)65
7071
intmain()
7288 printf("
%lld\n
",ans);89}
90return0;
91 }
HIHOCODER 1509 異或排序
給定乙個長度為 n 的非負整數序列 a 1.n 你需要求有多少個非負整數 s 滿足以下兩個條件 1 0 s 260 2 對於所有 1 i n 有 a i xor s a i 1 xor s 第一行乙個正整數 n 第二行 n 個非負整數表示序列 a 1.n 1 n 50 0 a i 260 乙個非負正...
hihocoder1693 逆序異或和
時間限制 10000ms 單點時限 1000ms 記憶體限制 256mb 給定長度為n的序列a1,a2,an,求 其中xor是按位異或運算。第一行包含乙個整數n。第二行包含n個整數a1,a2,an。對於60 的資料,1 n 5000 對於100 的資料,1 n 100000,1 ai 100000 ...
hihoCoder挑戰賽28 A 異或排序
題目鏈結 題意 題解 每次找到相鄰兩個數的二進位制形式中 不同的最高位 顯然s在這一位必然是確定的 必須在這一位確定數字讓a i a i 1 至於更高位的,它們的數字是相同的,以及更低位的 它們都任意 因為要對於所有的i 1.n 1 都滿足要求 所以看看哪些位置最後是確定的 或者發生了牴觸 直接輸出...