19牛客多校第九場 D題 折半列舉

2021-09-26 05:37:06 字數 1121 閱讀 6840

給你個序列和數字s,問你哪些數的和等於s,要求輸出01串,表示對應位置的數字取與不取。

最多有36個數字,傳統的搜尋,最多 236 次操作,加上剪枝也會tle。

這裡用折半列舉(思想**於傳統的雙向搜尋)就可以解決問題。

把序列分成兩個部分,分別列舉這兩個部分的組合,然後對於其中乙個部分的和,看另乙個部分有沒有這樣一種,使得它跟第乙個部分之和等於題目給的s,這裡用lower_bound即可。

#include

using

namespace std;

typedef

long

long ll;

ll n, s;

ll num[40]

;int cnt1 =0;

int cnt2 =0;

struct node

}a[1

<<20]

, b[

1<<20]

;bool

cmp(

struct node a,

struct node b)

intdfs1

(int i,

int e, ll sum, ll consist)

if(i +

1<= e)

//不取

return0;

}int

dfs2

(int i,

int e, ll sum, ll consist)

if(i +

1<= e)

return0;

}int

main()

if(n <=18)

else

if(n >18)

if(n <=18)

return0;

}}}else

if(n >18)

)- b;

if(a[i]

.sum + b[pos]

.sum == s)

b[pos]

.consist >>=18;

for(

;j <= n;

++j)

return0;

}}}return0;

}

2019牛客多校第九場

由題意可設x y kp bx y kp b x y kp b代入第二個式子中可以得到kpx bx x2 c mod kpx bx x 2 equiv c mod kpx bx x2 c modp p p 第一項是p的倍數可以約掉,所以有x2 bx c 0 m od x 2 bx c equiv 0 ...

牛客多校第九場部分題題解

include using namespace std typedef long long ll ll n,m int f 50000000 intqpow ll a,int b,int p return ret ll inv ll a,ll p ll findr int p while f i 1...

牛客多校第九場補題(待完善)

i the crime solving plan of groundhog 題目大意 給定一組由 0 9 組成的數,組成兩個數使乘積最小。解題思路 用陣列儲存 0 9 的個數,先從 1 9 選最小的作為其中乙個乘數,其餘的數組成所能表達的最小的數。難點應該是大數乘法 這個也不難 include in...