1. 程式人生 > >【補題】 POJ 3318 隨機化

【補題】 POJ 3318 隨機化

tor ring cnblogs targe -a b- stdin ref ()

題目鏈接:http://poj.org/problem?id=3318

題意:給你矩陣ABC,要求驗證A * B是否等於C。

思路:直接算的話復雜度n^3,妥妥TLE。

隨機化有兩種方法。

一是不斷隨機一個列矩陣,左乘驗證。

二是不斷隨機C裏的某個點驗證。

補充一下隨機函數知識點:

要取得[a,b)的隨機整數,使用(rand() % (b-a))+ a (結果值含a不含b)。
要取得[a,b]的隨機整數,使用(rand() % (b-a+1))+ a (結果值含a和b)。
要取得(a,b]的隨機整數,使用(rand() % (b-a))+ a + 1 (結果值不含a含b)。

(總的來說,通用公式:a + rand() % n ;其中的a是起始值,n是整數的範圍)

要取得a到b之間的隨機整數,另一種表示:a + (int)b * rand() / (RAND_MAX + 1)。

要取得0~1之間的浮點數,可以使用rand() / double(RAND_MAX)。

其實更簡單的是不隨機,直接找一個普通的列矩陣左乘就行了。

而且這題數據真的超級水。

有個小tips:

這題如果用隨機化的話,C++能過,G++過不了。(涉及精度的POJ上的題也這樣)

如果用下面這代碼的話,G++能過。

技術分享
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4
#include<algorithm> 5 #include<cmath> 6 #include<vector> 7 #include<set> 8 #include<string> 9 #include<sstream> 10 #include<cctype> 11 #include<map> 12 #include<stack> 13 #include<queue> 14 using namespace std; 15 #define INF 0x3f3f3f3f 16
typedef long long ll; 17 int gcd(int a, int b){return b==0?a:gcd(b,a%b);} 18 19 const int maxn = 510; 20 int a[maxn][maxn]; 21 int b[maxn][maxn]; 22 int c[maxn][maxn]; 23 int x[maxn]; 24 int xa[maxn]; 25 int xab[maxn]; 26 int xc[maxn]; 27 int n; 28 29 void input(int d[maxn][maxn]) 30 { 31 for(int i = 1; i <= n; i++) 32 for(int j = 1; j <= n; j++) 33 scanf("%d", &d[i][j]); 34 } 35 36 bool judge() 37 { 38 for(int j = 1; j <= n; j++) 39 { 40 for(int i = 1; i <= n; i++) 41 { 42 xa[j] += x[i] * a[i][j]; 43 xc[j] += x[i] * c[i][j]; 44 } 45 } 46 for(int j = 1; j <= n; j++) 47 for(int i = 1; i <= n; i++) 48 xab[j] += xa[i] * b[i][j]; 49 for(int i = 1; i <= n; i++) 50 if(xab[i] != xc[i]) 51 return false; 52 return true; 53 } 54 55 int main() 56 { 57 // freopen("input.txt", "r", stdin); 58 // freopen("output.txt", "w", stdout); 59 scanf("%d", &n); 60 input(a); 61 input(b); 62 input(c); 63 memset(xa, 0, sizeof(xa)); 64 memset(xab, 0, sizeof(xab)); 65 memset(xc, 0, sizeof(xc)); 66 for(int i = 1; i <= n; i++) 67 x[i] = i; 68 if(judge()) cout << "YES" << endl; 69 else cout << "NO" << endl; 70 return 0; 71 }
View Code

【補題】 POJ 3318 隨機化