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
typearr=records,b:longint;
end;
const maxn=6000007;
varn,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;
beginif y=1 then exit(x);if y mod 2=1 thenexit(sqr(mi(x,y div 2))*x)else exit(sqr(mi(x,y div 2)));
end;
procedure dfs(x,y:longint);
vart,d,i:longint;
beginif x>s thenbegind:=abs(y);t:=d mod maxn;while h[t].s<>0 dobeginif 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);
vart,d,i:longint;
beginif x>n thenbeginy:=-y;d:=abs(y);t:=d mod maxn;while h[t].s<>0 dobeginif 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;
beginreadln(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.