Equilateral Triangles
题目描述:
这个题目讲述的是,一个正三角形的边长为n,这个正三角形可以由若干个边长为1的正三角形组成。
以上图作为例子,边长为3的正三角形总共由9个边长为1的正三角形组成,然后我们将这些边长为1的正三角形的顶点标出来,题目让我们求的是,如果其中两个顶点所在的线段上存在其他顶点的话,求出满足这个条件的顶点对数。
题目分析:
对于边长为n的正三角形,我们可以将这个边长为n的正三角形看成是三个边长为n-1的正三角形组成,然后减去三个边长为n-2的正三角形,但是如果我们将边长为4的正三角形画出来的话,我们会发现需要加上1个边长为n-3的正三角形,除此之外,还要加上边长为n的正三角形三个顶点之间可以组成的三个顶点对。
除此之外,我们还要算上边长为n的正三角形三个顶点跟相应的对边上的顶点组成的顶点对数,我们可以将上面的图建立坐标系,这个坐标系的x轴与底边平行,y轴与x轴成60度,因此图中的每个点都可以用一个整数坐标去表示,我们可以通过任意两点的坐标去判断这两个点所在线段上是否存在其他点,我们可以求出两个坐标x值之差以及y值之差的最大公约数,如果它们的最大公约数大于1的话,就证明这两个点所在线段上存在其他点,加上这个顶点对。
所以边长为n的正三角形所求的答案便为边长为n-1的正三角形答案的三倍减去边长为n-2的正三角形答案的三倍,再加上边长为n-3的正三角形的答案以及3,最后加上边长为n的正三角形的三个顶点与相应对边上的顶点之间满足题目要求的顶点对。
代码:
#include <iostream>
#include <cstdio>
#include <stdio.h>
#include <cstdlib>
#include <stdlib.h>
#include <cmath>
#include <math.h>
#include <algorithm>
#include <cstring>
#include <string>
#include <string.h>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <bitset>
#include <deque>
#define reg register
#define ll long long
#define ull unsigned long long
#define INF 0x3f3f3f3f
#define eps 1e-3
#define min(a,b) (a<b?a:b)
#define max(a,b) (a>b?a:b)
#define lowbit(x) (x&(-x))
using namespace std;
const int Maxn=55;
int f[Maxn];
int gcd(int a,int b)
{
return (b==0?a:gcd(b,a%b));
}
int main()
{
int n;
scanf("%d",&n);
f[1]=0;f[2]=3;f[3]=12;
for (int i=4;i<=n;i++)
{
f[i]=3*f[i-1]-3*f[i-2]+f[i-3]+3;
int tot=0;
for (int j=2;j<=i-2;j++)
if (gcd(j,i-j)!=1) tot++;
f[i]+=tot*3;
}
printf("%d\n",f[n]);
return 0;
}