給你個序列和數字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...