看不清的看下面↓
已知乙個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≤
i≤n,求這個方程的解的個數
第1行包含乙個整數n。第2行包含乙個整數m。第3行到第n+2行,每行包含兩個整數,分別表示ki和pi。兩個整數之間用乙個空格隔開。第3行的資料對應i=1,第n+2行的資料對應i=n。
僅一行,包含乙個整數,表示方程的整數解的個數。
3150
1 2-1 2
1 2可能一看到這個題想到的就是直接暴力列舉
則時間複雜度為o(m
6)
o(m^6)
o(m6)但m
<
=150
m<=150
m<=1
50計算得出時間複雜度為o
(1.1390625×1
013
)o(1.1390625\times 10^)
o(1.13
9062
5×10
13)暴力列舉鐵定超時,但是我們可以把未知數折半,將一半的未知數移到右邊,只要左邊的結果等於右邊的結果的相反數,則這一組解是合法的。那麼這樣的時間複雜度就降為了
o (2
m3
)o(2m^3)
o(2m3)
可以通過此題。
對於當中方案的儲存,可以採用以下三種方法(我目前知道的)
1.開乙個hash表(本文採用的是這種方法)2.將左邊得到的所有結果存入乙個陣列中,再排序+二分查詢,查詢右邊所有答案在左邊出現的總次數3.與第二種類似,不過統計方案數的時候採用雙指標。
至於時間複雜度,我不會算,都是dalao講的。。。
#include
#define p 4000037
//要開乙個很大的質數
#define hash(a) (a)%p
//hash函式
#define r(i,a,b) for(int i=a;i<=b;i++)
//從a到b
using
namespace std;
int h[p][2
],a[7]
,b[7
],n,m,mid;
//h[i][0]是這個格仔對應的數字,h[i][1]是這個數出現的次數,a是係數,b是指數,mid是n的一半
long
long ans;
//最終答案
intabs
(int x)
//因為中間計算可能有負數,所以用到abs函式
intksm
(int x,
int y)
//ksm函式,用於求x的y次方。也可以開乙個二維陣列來存也行,效率還是快速冪快一點。當然如果你懶,你也可以直接用pow函式。
return ans;
}void
init()
voidtp(
)//特判,如果只有乙個未知數,且係數為0,則方程正好有m組解(x=1..m),否則無解
intfind
(int x)
//查詢x在hash表的位置
intin
(int x)
//將x元素加進hash表
boolpd(
int x)
//判斷x這個元素是否在hash表內
void
dfs1
(int dep,
int sum)
//搜前半段
void
dfs2
(int dep,
int sum)
//後半段
else
r(i,
1,m)
dfs2
(dep+
1,sum+a[dep]
*ksm
(i,b[dep]))
;//繼續搜
}int
main()
}
NOI 2001 方程的解數
已知乙個 n 元高次方程 k 1x 1 k 2x 2 k nx n 0 要求所有的 x i 取值範圍為 1,m 且為整數,求方程的解數。發現 150 6 複雜度 自然能想到折半搜。先搜前一半的所有可能的答案,存進雜湊表裡,然後搜後一半的答案,在雜湊表裡查相反數,如果存在就累加上個數。然後 map 就...
方程的解 NOI導刊2010提高
題目描述description佳佳碰到了乙個難題,請你來幫忙解決。對於不定方程a1 a2 ak 1 ak g x 其中k 2且k n,x是正整數,g x x x mod 1000 即x x除以1000的餘數 x,k是給定的數。我們要求的是這個不定方程的正整數解組數。舉例來說,當k 3,x 2時,分別...
二次同餘方程的解
本文 今天要討論的問題是解方程 引理 證明 由費馬小定理,引理 方程有解當且僅當 定理 設 剩餘方程 證明 由 號用了費馬小定理和 在演算法實現的時候,對 題目 include include include include include include include include inclu...