洛谷P2158 [SDOI2008]仪仗队 欧拉函数的应用

https://www.luogu.org/problem/P2158

 

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,ans;
int Star_Platinum(int n) {  //求欧拉函数 
    int sum=n;
    for(int i=2; i*i<=n; i++)
        if(n%i==0) {
            sum-=sum/i;
            while(n%i==0) n/=i;
        }
    if(n>1) sum-=sum/n;
    return sum;
}
signed main() {
    scanf("%lld",&n);
    if(n==1) {
        printf("0\n");   //特判 
        return 0;
    }
    for(int i=2; i<=n-1; i++) ans+=Star_Platinum(i);
    printf("%lld\n",ans*2+3);   //求总的数目 
    return 0;
}

建立平面直接坐标系,将左下角看作原点,如果__gcd=(x,y)==1,那么就能看见,因为方阵为正方形,所以,利用这两个性质,先将方阵分割成两个直角三角形,再反别算2到n-1的欧拉函数,最后*2+3

 

posted @ 2019-10-20 09:57  晴屿  阅读(107)  评论(0编辑  收藏  举报