這次是矩陣與行列式
題目一:bzoj1013
我看到這題時反正沒什麼感覺。。。
其實對於球來說。。其上每乙個點到球心的距離都是相等的。。。於是就可以根據這個來列方程
設球心為(x1,x2,...)對於點(a1,a2,...),(b1,b2,...) 有σ(ai-xi)^2=σ(bi-xi)^2
看起來很麻煩。。因為方程有二次項
但其實這個式子是可以開啟的。。。開啟後變成σ2*(bi-ai)xi = σbi^2-σai^2 二次項被消掉了,直接就是線性方程(我當時居然覺得ai^2這些是二次項沒消掉糾結了半天,真是太傻×了)
然後確定乙個點出來。。其他所有點都與這個點一起建立乙個線性方程,組成線性方程組。。。
然後直接高斯消元就搞定了...
#include#include#include#include#include#includeusing namespace std;
int n;
double a[10+5][10+5];
double zb[10+5][10+5],fsum=0;
void gauss()
if(maxt!=i)for(int j=1;j<=n+1;j++)swap(a[i][j],a[maxt][j]);
for(int j=i+1;j<=n;j++)
}for(int i=n;i>=1;i--) }
int main()
for(int i=1;i<=n;i++)
a[i][n+1]=suma-fsum;
} gauss();
for(int i=1;i
這個題嘛。。。線性遞推關係。。。一看就是矩陣乘法優化
設 矩陣v[t+1]=a*v[t],然後v[k]就等於 a^k *v[0]
但是仔細分析下矩陣乘法優化後的複雜度為 o(n^3logk),還是t得比較爽
而兩個迴圈矩陣的乘積依舊是迴圈矩陣 。。所以我們在求a^k時,只計算和儲存第一行就行了。。。
所以求a^k這個過程的複雜度就變成了 o(n^2logk).
#include#include#include#include#include#includeusing namespace std;
int n,m,d,k;
int m[500+10][1];
int ele[500+10];
int temp[500+10];
int temp2[500+10];
int temp4[500+10];
int te***[500+10][1];
void mul2(int a,int b[1])
}int main()
if(abs(a[maxt][i])=i;k--)
}} }
}int main()
a[1][n+1]=1;
for(int i=1;i<=n;i++)
}gauss_jordan();
for(int i=n;i>=1;i--)
}printf("case #%d:\n",cas);
int q;
scanf("%d",&q);
for(int i=1;i<=q;i++)
{ int u;
scanf("%d",&u);
if(inf[u])printf("infinity\n");
else printf("%.3f\n",fabs(a[u][u])
這個我也比較暈。。。就說一句:異或方程組的消元過程進行幾行 大概就是 確定了多少個未知數吧(說錯了不要打我)
數學專題訓練3
這次是概率專練 選的題都比較基礎。因為我對概率的感覺很不到位啊啊啊啊 題目一 wikioi計算概率 這個就是古典概型嘛。先列舉選的第一根。然後再求出第選二根後和小於等於l的方案個數。然後答案很自然就是 這些方案個數的和 n n 1 了。考慮到n稍大。求方案數不能直接暴力。可以選擇二分來求 要注意選的...
數學專題測試4
看到這個資料範圍多半是高斯消元。所以問題是如何處理出每局的勝率。容易發現平局是沒有意義的,要求的是最大的勝 負,這是乙個分數問題,無法進行簡單加和。所以正確的做法是01分數規劃。通過二分答案,將分母部分直接作減法。於是只要維護最大的分子 k 分母就可以了。本題的第二部分存在乙個直接計算的式子,但是我...
專題訓練(2)
本週的學習內容 樹狀陣列 用於對區間操作非常方便。1001 求乙個整數,二進位制表示形式中最低位的1代表的整數。就是樹狀陣列中,求lowbit的操作。題解 include using namespace std intmain return0 1002 樹狀陣列的應用。點操作,區間查詢。剛開始樹狀陣...