方程的解數 difficult

2021-07-25 14:24:34 字數 1835 閱讀 4804

已知乙個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...