poj3090--欧拉函数

#include<iostream>
using namespace std;
//欧拉函数 
int eular(int n){
    int res=1,i;
    for(int i=2;i*i<=n;i++){
        if(n%i==0){
            n/=i;res*=i-1;
            while(n%i==0){
                n/=i;res*=i;
            }
        }
    }
    if(n>1)
    res*=n-1;
    return res;
}
int main(){
    int n,m,sum;
    cin>>n;
    for(int i=1;i<=n;i++){
        sum=3;
        cin>>m;
        for(int j=2;j<=m;j++)
        sum+=eular(j)*2;//除(1,1)外,其余的点都有对称点 
        cout<<i<<" "<<m<<" "<<sum<<endl;
    }
    return 0;
}

此题与Poj2407相似,不过有对称点需考虑。

我们仔细观察题目会发现符合条件的点的坐标x,y都是互质的,1与1互质这是个特例,因为它是唯一一个符合没有对称点的点,需特殊考虑,此外还有(0,1),(1,0)

两点,故sum起始为3,其余加上的是欧拉函数x2

posted on 2015-10-09 20:40  T~Z  阅读(160)  评论(0编辑  收藏  举报