1. 程式人生 > >莫比烏斯反演裸題 有向線段問題

莫比烏斯反演裸題 有向線段問題

問題描述
LaTeX是一種基於TeX的排版系統,由美國計算機學家萊斯利·蘭伯特(Leslie Lamport)在20世紀80年代初期開發,利用這種格式,即使使用者沒有排版和程式設計的知識也可以充分發揮由TeX所提供的強大功能,能在幾天,甚至幾小時內生成很多具有書籍質量的印刷品。特別是,它能生成複雜表格和十分精美的數學公式,因此非常適用於生成高印刷質量的科技和數學類文件。
在Latex中,對有向線段的作法是採用如下命令格式進行的:
\put(x,y){\vector(a, b){length}}
其中(x, y)表示有向線段的起點,(a, b)表示有向線段的方向,即對應的斜率,length是線段長度。例如: \put(x,y){\vector(1,0){6}}是起點在(x, y)長度為6指向右邊的有向線段,\vector(0,1){6}是長度為6指向上方的有向線段。
但在Latex中,a、b只能取從-6 ~ +6之間的整數,且兩數不能有大於1的公因子。因此Latex中表示的有向線段方向是有限的幾個。在a、b取非負整數的情況下僅有25個。
現在你的任務是為擴充套件Latex軟體功能時估算一下:為簡單起見,給定正整數n,如果表示有向線段方向的a、b可取從0 ~ n之間的整數,那麼有向線段的方向有多少個?
輸入:
輸入有若干行,每行上有一個整數n, 1n10000。
輸出:
對輸入中的每個整數n,輸出有向線段的方向個數。
輸入樣例:
6
100
輸出樣例:
25
6089
如果x,y約分後和之前某組x,y相同的話就不算新的方向。

#include<bits/stdc++.h>
using namespace std;
//最大公約數方法
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {int i,j;
    long long ans=n*n;
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=n;j++)
        {
            if(__gcd(i,j)>1)
            ans--;
        }
    }
    printf("%lld\n",ans+2);
    }
    return 0;
}

暴力查詢居然過了。
等學會了莫比烏斯反演再更。