方程的解数(dfs优化)

来源:互联网 发布:淘宝口碑客服电话 编辑:程序博客网 时间:2024/05/16 00:36

题意:

这里写图片描述
p=n x<=150正整数;

思路:

因为里面的乱七八糟的都是题目给你的,所以不能用数学方法做,然后就枚举一下。把他分成两份,只要前面的那一半加上后面的一半,等于0,就是方程成立的,所以就只用枚举三个未知数,时间复杂度为(m*m*m不会打次方)。然后又可以知道前面三个数和后面三个数为相反数,所以题目就变成了,前面未知数组成的数要等于后面的数的相反数,在查找过程中用到hash优化,时间复杂度忽略不计。

const maxn=4000037;var hash:array [0..maxn,1..2] of longint; i,j,n,m:longint; a:array [1..6,1..2] of longint; mi:array [0..150,0..30] of longint; ans:int64;procedure init;var i,j:longint;begin readln(n,m); for i:=1 to n do  readln(a[i,1],a[i,2]); for i:=1 to 30 do  mi[1,i]:=1; for i:=2 to m do begin  mi[i,0]:=1;  for j:=1 to trunc(ln(maxlongint)/ln(i)) do   mi[i,j]:=mi[i,j-1]*i; end;end;procedure insetion(x:longint);var i,j:longint;begin i:=abs(x) mod maxn; while (hash[i,1]<>0) and (hash[i,1]<>x) do i:=i mod maxn+1; hash[i,1]:=x; inc(hash[i,2]);end;function find(x:longint):longint;var i,j:longint;begin i:=abs(x) mod maxn; while (hash[i,1]<>0) and (hash[i,1]<>x) do i:=i mod maxn+1; find:=iend;procedure dfs(dep,o:int64);var i,j,k:longint;begin if dep>n div 2 then begin  insetion(o);  exit; end; for i:=1 to m do  dfs(dep+1,o+a[dep,1]*mi[i,a[dep,2]]);end;procedure dfs1(dep,o:int64);var i,j,k,p:longint;begin if dep>n then begin  p:=0;  p:=find(-o);  if hash[p,1]=-o then ans:=ans+hash[p,2];  exit; end; for i:=1 to m do  dfs1(dep+1,o+a[dep,1]*mi[i,a[dep,2]]);end;begin init;  dfs(1,0);  dfs1((n div 2)+1,0);  writeln(ans);end.
0 0
原创粉丝点击