某種密碼(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 ...