2014 10 4模擬賽 某種密碼

2021-06-26 03:05:07 字數 1542 閱讀 9502

某種密碼(password.*)

關於某種密碼有如下描述:某種密碼的原文a是由n個數字組成,而密文b是乙個長度為n的01數串,原文和密文的關聯在於乙個鑰匙碼key。若key=∑▒〖ai*bi〗,則密文就是原文的一組合法密碼。

現在有原文和鑰匙碼,請編乙個程式來幫助他統計到底有多少個符合條件的密文。

【輸入資料】

第一行兩個數n,key,意義同題目描述;

第二行n個數表示原文a,意義同題目描述。

【輸出資料】

乙個數ans,表示對於原文a和key,有多少組可行的密文b。

【輸入樣例】

3 21 1 2

【輸出樣例】

【樣例說明】

密文110,1*1+1*1+0*2=2

密文001,0*1+0*1+1*2=2

一共兩組可行的密文。

【資料約定】

60%資料滿足n<=25

100%資料滿足n<=40,-maxlongint<=∑▒ai<=maxlongint

題意是給定n個數,要求做01揹包之後和為key的方案數

首先n<=25的直接2^n爆搜就好了

當n<=40的時候,有一種做法是類似「方程的解數」那題的前後分開暴力

假設b是乙個滿足σa[i]*b[i]=key的01序列

首先,b陣列必須剛好n個數

顯然b陣列最多有2^40種不同的排列,直接爆蒐會t

但是我們把b的前n/2個元素暴力列舉出來,最壞情況下是2^20,用hash存起來

然後再暴力列舉後n-n/2個,最壞也是2^20,統計答案的時候只要找前面跟它剛好匹配的方案數就好了

比如找到一種和為a的方案,只要在雜湊表中找前20個中和為key-a的方案數累加就好了

這樣複雜度降到(n/2)*2^(n/2)

在考場上a[i]開了long long但是讀入沒有用%lld就只有70……蛋疼

#include#include#include#define ll long long

#define mod 1000007

#define deliver n/2

using namespace std;

struct hashinghash[5000000];

int head[mod];

int n,m,cnt;

ll ans;

ll a[100];

inline void ins(ll u,ll w)

inline void insert(ll u,ll w)

ins(s,w);

}inline int get(int u)

int main()

{ freopen("password.in","r",stdin);

freopen("password.out","w",stdout);

scanf("%d%d",&n,&m);

for (int i=1;i<=n;i++)scanf("%lld",&a[i]);

sort(a+1,a+n+1);

for(int i=0;i<=(1<

noip模擬賽 某種數列問題

眾所周知,chenzeyu97有無數的妹子 阿掉!而且他還有很多惡趣味的問題,繼上次糾結於一排妹子的排法以後,今天他有非 chi 常 bao 認 cheng 真 zhe 去研究乙個奇怪的問題。有一堆他的妹子站成一排,然後對於每個妹子有乙個美麗度,當然美麗度越大越好,chenzeyu97妹子很多,但是...

NOIP模擬賽 某種數列問題

眾所周知,chenzeyu97有無數的妹子 阿掉!而且他還有很多惡趣味的問題,繼上次糾結於一排妹子的排法以後,今天他有非 chi 常 bao 認 cheng 真 zhe 去研究乙個奇怪的問題。有一堆他的妹子站成一排,然後對於每個妹子有乙個美麗度,當然美麗度越大越好,chenzeyu97妹子很多,但是...

2014 10 4模擬賽 球的序列

球的序列 formation.n個編號為1 n的球,每個球都有唯一的編號。這些球被排成兩種序列,分別為a b序列,現在需要重新尋找乙個球的序列l,對於這個子串行l中任意的兩個球,要求j,k j輸入 第一行乙個整數,表示n。第二行n個整數,表示a序列。第三行n個整數,表示b序列。樣例輸入 1 2 4 ...