Timus 1981. Parallel and Perpendicular

果7發表於2013-10-21

1981. Parallel and Perpendicular

Time limit: 0.5 second
Memory limit: 64 MB
You are given a regular n-gon. Your task is to calculate two values: the number of its diagonals that are parallel to at least one of its other diagonals, and the number of its diagonals that are perpendicular to at least one of its diagonals. A diagonal is a segment connecting two non-adjacent polygon vertices.

Input

The only line contains an integer n (4 ≤ n ≤ 105).

Output

Output two required numbers.

Sample

input output
4
0 2
Problem Author: Grigory Nazarov


題目大意:題目意思很簡單,給你正n邊形,n>=4,問你有多少條存在平行對角線的對角線,有多少條存在垂直於對角線的平行線。比賽的時候太累了,當時也有點事情,就沒往下推,後來竟然發現是忘記把n=6的情況拿出來討論了。QAQ。。

解題思路:也不知道當時自己是怎麼畫的圖,反正n=6的情況也求成了9 9,但是今天又畫了一下,竟然是6 9 比賽的時候把是這樣考慮的,4 5的情況拿出來討論。。然後n是偶數的話,分兩種情況算,一種是與頂點成對稱軸那條線平行的,這樣的情況是(n/2)*((n-2)/2),因為去掉上下兩個點,其它組成平行的就是(n-2)/2,然後*n/2是因為有n個頂點,不過沒條線都會算重複一遍。另一種情況是與相鄰兩頂點形成的線平行的情況,這樣去掉最上面兩點,去掉最下面兩個點,就是(n/2)*((n-4)/2)。兩個加起來就是偶數的情況。偶數的情況垂直與平行條數相等,由於對稱。 n為奇數的時候,從一個點作(n-3)條對角線,發現這麼多條,要麼和上面說的第一種情況點平行,要麼就是第二種情況與線平行。而且這樣條數就是(n-3)*n/2,除以2是因為每條對角線重複算了一次。 


這是當時比賽的思路,可以A掉。
這是少討論了6啊。TAT!!!
程式碼:
#include<iostream>
#include<cstring>
#include<string>
#include<cmath>
#include<cstdio>
#include<algorithm>
using namespace std;

int main()
{
    long long n;
    while(~scanf("%lld",&n))
    {
        long long a,b;
        if(n==4) cout<<"0 2"<<endl;
        else if(n==5) cout<<"0 0"<<endl;
        else if(n==6) cout<<"6 9"<<endl;  //有三根是不存在平行,只有垂直的
        else
        {
            if(!(n&1))
            {
                a=(n/2)*((n-2)/2);   //與點平行的
                a+=(n/2)*((n-4)/2);  //與邊平行的
                b=a;
            }
            else
            {
                a=n*(n-3)/2;
                b=0;
            }
            printf("%lld %lld\n",a,b);
        }
    }
    return 0;
}


後來仔細想了下,原來兩種情況原來是一樣的,偶數的時候奇數的時候都是求得所有的對角線,當時怎麼就沒發現,確實是這樣,每條對角線都會有平行的,如果是偶數,每條對角線有垂直的。當時沒有多想。。
AC程式碼:
#include<iostream>
#include<cstring>
#include<string>
#include<cmath>
#include<cstdio>
#include<algorithm>
using namespace std;

int main()
{
    long long n;
    while(~scanf("%lld",&n))
    {
        long long a,b;
        if(n==4) cout<<"0 2"<<endl;
        else if(n==5) cout<<"0 0"<<endl;
        else if(n==6) cout<<"6 9"<<endl;  //有三根是不存在平行,只有垂直的
        else
        {
            a=n*(n-3)/2;   //所有對角線的條數
            b=0;
            if(!(n&1)) b=a;
            printf("%lld %lld\n",a,b);
        }
    }
    return 0;
}

當時察覺出來了6有點奇怪,因為中間的對角線沒有平行的,短路了。。

相關文章