分析:n的最大值能達到35,有2^35種狀態,不能直接列舉所有的狀態。
但可以把n分成兩個部分,這樣每個部分的狀態列舉就能在規定時間內達到。
設i為第乙個部分的狀態,j為第二個部分的狀態。
則有(ai+aj)/(bi+bj)=x/y,進一步化為 ai*y-bi*x=bj*x-aj*y
就可以在將每個第一部分的狀態,通過二分找到第二部分中能與之匹配的狀態
**如下:
#include #include#include
#include
using
namespace
std;
const
int maxn=40
;typedef
long
long
ll;int
a[maxn];
intb[maxn];
intt,x,y,n,n1,n2,nowa,nowb;
ll ans;
int poi1[1000100],poi2[1000100
];int
main()
}poi1[cnt1]=nowa*y-nowb*x;
cnt1++;
}n2=n-n1;
for(int i=0;i<(1
<)
}//coutcnt2++;
}sort(poi2+1,poi2+cnt2);
for(int i=1;i)
cout
<1
<}
return0;
}
小馬哥的超級鹽水
來呀 題意 給n杯鹽水,每一杯水有a單位鹽,b單位水。給你乙個x和y,問有多少種方法能配成x比y的鹽水。因為n只有35,沒法列舉全部情況,如果n只有一般大,那麼我們可以列舉所有情況。我們可以把n分為兩部分,列舉一部分的所有情況,然後找是否能和另一部分構成解。對於 a1,b1 和 a2,b2 這兩個集...
K 小馬哥的超級鹽水 分治 暴力
時間限制 c c 5秒,其他語言10秒 空間限制 c c 131072k,其他語言262144k 64bit io format lld 小馬哥有 輸入第一行包含乙個整數每組資料第一行包含三個整數 接下來每組資料輸出一行,包含乙個整數表示非空子集的個數。示例1 1 5 1 2 1 21 2 1 21...
18華工校賽 小馬哥的超級鹽水 折半列舉
小馬哥有 n 杯鹽水,第 i 杯有 a i 單位的鹽和 b i 單位的水。小馬哥很無聊,於是他想知道有多少種這 n 杯鹽水的非空子集,倒在一起之後鹽和水的比是 frac 範圍 2 這道題比賽沒a出來,要是a了就能兩個人分900塊辣 隔了一天才突然想到,我太菜了 折半列舉過程如下 分兩個桶a,b,分別...