已知乙個n元高次方程:
k1x1p1+k2x2p2+……+knxnpn = 0
假設未知數1≤ xi ≤m, i=1,,,n,求這個方程的整數解的個數。
第1行包含乙個整數n。第2行包含乙個整數m。第3行到第n+2行,每行包含兩個整數,分別表示ki和pi。兩個整數之間用乙個空格隔開。第3行的資料對應i=1,第n+2行的資料對應i=n。
僅一行,包含乙個整數,表示方程的整數解的個數。
3 150
1 2
-1 2
1 2o(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=1then
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
dobegin
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
dobegin
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.
方程的解數
蒜頭君在求解乙個 n n 元的高次方程 displaystyle k 1x 1 k 2x 2 ldots k nx n 0k1 x1p 1 k2 x 2p2 kn x npn 0其中 x 1,x 2,ldots,x nx1 x2 xn 是未知數,k 1,k 2,ldots,k nk1 k2 kn 是...
方程的解數
問題描述 蒜頭君在求解乙個 n 元的高次方程 假設未知數 1 xi m,i 1 n。你能幫蒜頭君算出這個方程的整數解個數嗎?輸入格式 第一行輸入乙個整數 n 1 n 4 第二行輸入乙個整數 m 1 m 150 第 3 行到第 n 2 行,每行輸入兩個整數,分別表示 k k 20 pi 1 pi 4 ...
DFS hash 方程的解數
題目描述 input 第1行包含乙個整數n。第2行包含乙個整數m。第3行到第n 2行,每行包含兩個整數,分別表示ki和pi。兩個整數之間用乙個空格隔開。第3行的資料對應i 1,第n 2行的資料對應i n。output 僅一行,包含乙個整數,表示方程的整數解的個數。資料範圍 1 n 6 1 m 150...