Description
已知一个n元高次方程:
k1x1p1+k2x2p2+……+knxnpn = 0
假设未知数1≤ xi ≤M, i=1,,,n,求这个方程的整数解的个数。
Input
第1行包含一个整数n。第2行包含一个整数M。第3行到第n+2行,每行包含两个整数,分别表示ki和pi。两个整数之间用一个空格隔开。第3行的数据对应i=1,第n+2行的数据对应i=n。
Output
仅一行,包含一个整数,表示方程的整数解的个数。
Sample Input
3
150
1 2
-1 2
1 2
Sample Output
178
思路
O(2N^3)
先搜索前三个多项式,把结果保存在hash表里,在搜索后三个多项式,如果结果为0,就加1
type
arr=record
s,b:longint;
end;
const maxn=6000007;
var
n,m,i,s,d,ans:longint;
k,p:array[0..7] of longint;
h:array[0..maxn] of arr;
function mi(x,y:longint):longint;
begin
if y=1 then exit(x);
if y mod 2=1 then
exit(sqr(mi(x,y div 2))*x)
else exit(sqr(mi(x,y div 2)));
end;
procedure dfs(x,y:longint);
var
t,d,i:longint;
begin
if x>s then
begin
d:=abs(y);
t:=d mod maxn;
while h[t].s<>0 do
begin
if h[t].s=y then break;
t:=(t+1) mod (maxn+1)
end;
h[t].s:=y;inc(h[t].b);
exit;
end;
for i:=1 to m do dfs(x+1,y+k[x]*mi(i,p[x]));
end;
procedure dfs1(x,y:longint);
var
t,d,i:longint;
begin
if x>n then
begin
y:=-y;
d:=abs(y);
t:=d mod maxn;
while h[t].s<>0 do
begin
if h[t].s=y then break;
t:=(t+1) mod (maxn+1)
end;
if h[t].s=y then inc(ans,h[t].b);
exit;
end;
for i:=1 to m do dfs1(x+1,y+k[x]*mi(i,p[x]));
end;
begin
readln(n);
readln(m);
for i:=1 to n do readln(k[i],p[i]);
s:=n div 2;d:=s+1;
dfs(1,0);
dfs1(d,0);
writeln(ans);
end.