NOI 2001 方程的解數

2022-03-30 01:43:02 字數 1325 閱讀 2237

\(\\\)

已知乙個 \(n\) 元高次方程:

\[k_1x_1^+k_2x_2^+...+k_nx_n^=0

\]要求所有的 \(x_i\) 取值範圍為\([1,m]\)且為整數,求方程的解數。

\(\\\)

發現 \(150^6\) 複雜度**,自然能想到折半搜。

先搜前一半的所有可能的答案,存進雜湊表裡,然後搜後一半的答案,在雜湊表裡查相反數,如果存在就累加上個數。

然後 \(map\) 就被卡 \(t\) 了。其實這篇題解是雜湊表學習筆記......

雜湊表可以理解為一種類似多頭鍊錶的結構。當答案很大但是答案的個數並不是很多的時候選擇。

每次得到乙個答案先將他縮小在\([1,mod]\)範圍內,然後查詢這個值是否有儲存過,如果有就累加計數器。

如果沒有的話操作就很有意思了。考慮到可能會有多個數經過模運算得到的答案相同,所以不能直接在模運算所得答案處儲存這個數,而要像鄰接表一樣,由這個答案向真正的數連一條邊,邊權就是個數。

然後查值得時候操作就和遍歷鄰接表一樣了。因為模數選擇質數,所以得到的答案分布還是很均勻的,單次查詢和累加複雜度都接近\(\text o(1)\)。

\(\\\)

#include#include#include#include#include#include#include#include#define r register

#define gc getchar

#define mod 6893911

using namespace std;

inline int rd()

while(isdigit(c))

return f?-x:x;

}int n,m,t[10],k[10],ans;

struct hashtablee[4000000];

inline void add(int u,int v)

inline int find(int x)

inline void insert(int x)

add(tmp,x);

}}}s;

inline int qpow(int x,int t)

return res;

}void dfsl(int p,int sum)

for(r int i=1;i<=m;++i) dfsl(p+1,sum+k[p]*qpow(i,t[p]));

}void dfsr(int p,int sum)

for(r int i=1;i<=m;++i) dfsr(p+1,sum+k[p]*qpow(i,t[p]));

}int main()

NOI 2001 第二試 方程的解數

看不清的看下面 已知乙個n nn元高次方程 其中,x ix i xi 是未知數,k ik i ki 是係數,p ip i pi 是指數。方程中的所有書均為整數。假設1 x i m 150,1 i n1 leq x i leq m leq 150,1 leq i leq n 1 xi m 15 0,1...

1436 方程的解數

這道題的方法很簡單,關鍵在於這道題有很多角度都能切入思考,能不能快速想到合適的解法。方法步驟 將k化為二進位制,則對應bit位置若為0,則a1,a2,an相應的bit位設為b1,b2,bn。相鄰2個bi不能同時為1。考慮這樣情況的總數。既然不能出現連續的1。設方法總數為f n bn為1時,b n 1...

poj 1186 方程的解數

方程的解數 time limit 15000ms memory limit 128000k total submissions 6393 accepted 2198 case time limit 5000ms description 已知乙個n元高次方程 其中 x1,x2,xn是未知數,k1,k2...