題解我們首先按位考慮。
如果有一位最終的結果為1,那麼我們可以把樹的序列看成乙個二進位制數,先出現的在底位,後出現的在高位,操作序列也可以看做乙個二進位制數,\(and\)為1,\(or\)為0,先出現的在低位,後出現的在高位。
首先操作序列是不可能把0變成1的,那麼要使最後的結果為1,就得考慮數字序列最高位的1,那麼如果操作序列的更高位有1,結果肯定會變成0,否則如果操作序列這一位不是1,那麼結果肯定是1。
如果這兩種情況都不是,那麼說明這一位操作序列和數字序列都是1,這時就得往低位繼續判斷。
如此歸納下去,如果需要滿足這一位為1,必須要求數字序列》操作序列。
再考慮多位的情況,相當於是有很多的限制。
這樣我們就會得到乙個性質,合法的序列是一段連續的二進位制數。
我們直接把所有序列拍完序後對每個詢問暴力掃就好了。
注意邊界!!!!
**
#include#define n 5009
#define m 1009
using namespace std;
typedef long long ll;
const int mod=1000000007;
char s[n];
int n,m,q,rnk[n];
ll ji[n],cnt[n];
inline void mod(ll &x)
inline ll rd()
while(isdigit(c))
return f?-x:x;
}struct skr
}a[n];
int main()
} for(int i=1;i<=m;++i)a[i].id=i;
sort(a+1,a+m+1);
for(int i=1;i<=m;++i)rnk[a[i].id]=i;
for(int i=1;i<=m;++i)for(int j=1;j<=n;++j)if(a[i].a[j])mod(cnt[i]+=ji[n-j]);
for(int j=1;j<=n;++j)mod(cnt[0]+=ji[n-j]);mod(cnt[0]+=1);
while(q--)
return 0;
}
題解 HNOI 2018尋寶遊戲
洛谷 bzoj連題面都不貼 題面 題目概述 給定n nn個長為m mm的01串,q qq次詢問,每次給定乙個長為m mm的目標串,求有多少種在n nn個串間填 位與 和 位或 符的方法使得最終計算結果為目標串 考試時忘記拼接程式了 o 對於10 10 10 的部分分可以o q 2n o q cdot...
Hnoi2018 遊戲 拓撲排序
一次小g和小h在玩尋寶遊戲,有n個房間排成一列,編號為 1,2,n 1,2 n 相鄰的房間之間都有一道門。其中一部分們上鎖 因此需要有對應的鑰匙才能開門 其餘的門都能直接開啟。現在小g告訴了小h每把鎖的鑰匙在哪個房間裡 每把鎖鎖有且只有一把鑰匙與之對應 並作出p次指示 第i次讓小h從第 si s i...
5285 Hnoi2018 尋寶遊戲
鏈結分析 從下面依次確定運算符號,然後在確定的過程中,需要確定的位數會逐漸減少。比如最後有乙個1,如果在從下往上確定了乙個or 1,那麼再往前可以隨便選了。那麼就是要求從下往上,第乙個出現的or 1要在and 0之前。如果將這一位上的每乙個數字拿出來,從下往上構成乙個二進位制數a,把and看成1,o...