BJOJ2190|SDOI仪仗队|数论

Description
作为体育委员,C君负责这次运动会仪仗队的训练。仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是否整齐(如下图)。

     

现在,C君希望你告诉他队伍整齐时能看到的学生人数。
Input
共一个数N。
Output
共一个数,即C君应看到的学生人数。
Sample Input
4
Sample Output
9
HINT
【数据规模和约定】对于100% 的数据,1≤N≤40000

分析:这一道题我们可以发现,如果(x,y)能看见,那么(kx,ky)就看不见。也就是说,只有当x和y互质的时候,我们才能看见。

又根据上图的对称性,我们可以只算一半。注意(1,1)算了两遍,(0,1)(1,0)没有算上。

#include<iostream>
using namespace std;

int ans, n, a[40001];

int main() 
{
    cin >> n;
    n--;
    for (int i=1; i<=n; i++) a[i]=i;        //PHI(I)
    for (int i=2; i<=n; i++)      //筛法求phi(i)
        if (a[i]==i) 
        {
            int p=1;
            while (p*i<=n) 
            {
                a[p*i]=a[p*i]/i*(i-1);
                p++;
            }
        }
    for (int i=1; i<=n; i++) ans+=a[i];
    ans=ans*2+1;  
    cout << ans;
    return 0;
}

 

posted @ 2015-07-16 09:33  竹夭公子  阅读(190)  评论(0编辑  收藏  举报