數學專題訓練4

2021-06-20 17:54:14 字數 1777 閱讀 1453

這次是矩陣與行列式

題目一: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 樹狀陣列的應用。點操作,區間查詢。剛開始樹狀陣...