題意:
給定n個向量,任選向量使其相加和爲0的方案數
解析:
n的範圍非常小,爆搜240會超時,我們可以優化
我們一半一半的搜 時間複雜度就優化成 2*220
前一半搜索我們標記一下哪些數的出現,後一半搜索就計算貢獻
#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
int n,m;
const int N=1100;
typedef long long ll;
typedef pair<int,int> PII;
PII q[N];
ll vis[N][N];
ll ans;
void dfs(int u,int x,int y)
{
if(u==m+1)
{
vis[x+500][y+500]++;
return ;
}
dfs(u+1,x,y);
dfs(u+1,x+q[u].x,y+q[u].y);
return ;
}
void dfs1(int u,int x,int y)
{
if(u==n+1)
{
ans+=(ll)vis[500-x][500-y];
return ;
}
dfs1(u+1,x,y);
dfs1(u+1,x+q[u].x,y+q[u].y);
return ;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>q[i].x>>q[i].y;
m=n/2;
dfs(1,0,0);
dfs1(m+1,0,0);
cout<<ans-1<<endl;
}