ssl1127 方程的解數 HASH,dfs

2021-08-15 23:26:29 字數 1127 閱讀 2614

我只是湊數的。

第1行包含乙個整數n。第2行包含乙個整數m。第3行到第n+2行,每行包含兩個整數,分別表示ki和pi。兩個整數之間用乙個空格隔開。第3行的資料對應i=1,第n+2行的資料對應i=n。

僅一行,包含乙個整數,表示方程的整數解的個數。

3 150

1 2

-1 2

1 2聽真正的dalao講的@神奇冪偉,大概就是把方程分成兩半,如: k1

xp11

+k2x

p22=

−k3x

p33−

k4xp

44k 1x

1p1+

k2x2

p2=−

k3x3

p3−k

4x4p

4然後用深搜前半段找出第乙個的所有答案存進雜湊表裡(並且記錄出現次數),然後再搜一次後半段尋找與前半段答案相反的話就算上方案

#include

using

namespace

std;

const

int maxn=4000037;//雜湊個數

int n,m,hash[maxn],mid,a[7],p[7],num[maxn],s,ans;

intabs(int x)

//絕對值,定位時使用

int hashmath(int x)

//雜湊函式

int locate(int x)//定位用

void ins(int x)//加入

bool find(int x)//查詢

void dfs(int dep,int sum)//第一次搜

for (int i=1;i<=m;i++)

}void dfs2(int dep,int sum)

for (int i=1;i<=m;i++)

}int main()

mid=n/2;//分成兩段

dfs(1,0);

dfs2(mid+1,0);

printf("%d",s);

}

SSL 1127 方程的解數

我們可以把這個方程一半的加數移到右邊去,例k1x1p1 k2x2p2 k3x3p3 0移項變成k1x1p1 k2x2p2 k3x3p3可以減少我們列舉x的次數,用雜湊表存左邊求出的情況有哪些,在右邊列舉的時候我們就可以判斷是否和左邊相等,然後加上次數就可以了。include define maxn ...

SSL1127 方程的解數

第1行包含乙個整數n。第2行包含乙個整數m。第3行到第n 2行,每行包含兩個整數,分別表示ki和pi。兩個整數之間用乙個空格隔開。第3行的資料對應i 1,第n 2行的資料對應i n。僅一行,包含乙個整數,表示方程的整數解的個數。3 15012 1212 178它的x xx需要從1 m 1 m1 m列...

方程的解數 SSL 1127 並查集

第1 11行包含乙個整數n nn。第2 22行包含乙個整數m mm。第3 33行到第n 2 n 2n 2行,每行包含兩個整數,分別表示kiki ki和p ipi pi。兩個整數之間用乙個空格隔開。第3行的資料對應i 1 i 1i 1,第n 2 n 2n 2行的資料對應i n i ni n。outpu...