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