Equation

(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;
}

题外话:不要搞骚操作,多写几个变量,多写几句话死不了。

原文地址:https://www.cnblogs.com/last-diary/p/11406078.html