我只是湊數的。
第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...