莫比乌斯反演裸题 有向线段问题

问题描述
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;
}

暴力查找居然过了。
等学会了莫比乌斯反演再更。

猜你喜欢

转载自blog.csdn.net/weixin_43847469/article/details/84847162