(Equation)
这道题目把式子两面移一下项,变为
[a_1*x_1+a_3*x_3+a_5*x_5=a_2*x_2+a_4*x_4+a_6*x_6
]
然后用类似于(meet in the middle)的方法进行对式子两边统计
为什么当时没有做出来??
- 时间复杂度分析错了
- 主要原因还是搜索的答案数弄错了,正解的搜索方案数应该是 (k^3) ,如果考虑重复答案会更少,和 (a_i) 并没有关系,所以要仔细分析程序的时间复杂度
#include<iostream>
#include<cstdio>
#include<vector>
#include<map>
#define ll long long
using namespace std;
const int N=10,MAXN=1e6+100;
map<ll,int>m;
ll k,ans;
int base;
ll a[N],b[N];
int num[MAXN];
inline void dfs2(int x,ll sum)
{
if (!x)
{
if (m.find(sum)!=m.end())
ans+=num[m[sum]];
return ;
}
for (int i=1;i<=k;i++)
dfs2(x-1,sum+b[x]*i);
return ;
}
inline void dfs1(int x,ll sum)
{
if (!x)
{
if (m.find(sum)!=m.end()) num[m[sum]]++;
else
{
m[sum]=++base;
num[base]=1;
}
return ;
}
for (int i=1;i<=k;i++)
dfs1(x-1,sum+a[x]*i);
return ;
}
int main()
{
scanf("%lld",&k);
int num1=0,num2=0;
for (int i=1;i<=6;i++)
if (i%2==1) scanf("%lld",&a[++num1]);
else scanf("%lld",&b[++num2]);
dfs1(3,0);
dfs2(3,0);
printf("%lld
",ans);
return 0;
}
题外话:不要搞骚操作,多写几个变量,多写几句话死不了。