當給定網格大小N×M時,我必須解決一個問題,我必須找到「可以放入其中」的平行四邊形的數量,以便它們的每個座標是一個整數。NxM網格上的平行四邊形的數量
這裏是我的代碼:
/*
~Keep It Simple!~
*/
#include<fstream>
#define MaxN 2005
int N,M;
long long Paras[MaxN][MaxN]; // Number of parallelograms of Height i and Width j
long long Rects; // Final Number of Parallelograms
int cmmdc(int a,int b)
{
while(b)
{
int aux = b;
b = a -((a/b) * b);
a = aux;
}
return a;
}
int main()
{
freopen("paralelograme.in","r",stdin);
freopen("paralelograme.out","w",stdout);
scanf("%d%d",&N,&M);
for(int i=2; i<=N+1; i++)
for(int j=2; j<=M+1; j++)
{
if(!Paras[i][j])
Paras[i][j] = Paras[j][i] = 1LL*(i-2)*(j-2) + i*j - cmmdc(i-1,j-1) -2; // number of parallelograms with all edges on the grid + number of parallelograms with only 2 edges on the grid.
Rects += 1LL*(M-j+2)*(N-i+2) * Paras[j][i]; // each parallelogram can be moved in (M-j+2)(N-i+2) places.
}
printf("%lld", Rects);
}
例子:對於一個2x2的網格,我們有22個可能的平行四邊形。
我的算法的工作原理和它是正確的,但我需要使它更快一點。我想知道它怎麼可能。
P.S.我聽說我應該預處理最大公約數並將其保存在一個數組中,這會將運行時間減少到O(n * m),但我不確定如何在不使用cmmdc的情況下執行此操作(最大公約數)功能。
嗨。我很確定你的計算機科學老師只是問你這個問題,讓你找出這個問題有多難。接下來你可能會學到的是基於格問題的密碼學(又名下一個大事,那個量子計算機還不能打破:-) –
這不是我的計算機科學老師問我的東西,我可能有十倍比我的計算機科學老師更多的知識。這只是我準備在我的國家算法olymics。 – user3220503