欧拉函数入门

https://www.cnblogs.com/flipped/p/5324598.html 链接
欧拉函数就是 ϕ(n)=nn ϕ ( n ) = 不 超 过 n 且 与 n 互 素 的 正 整 数 的 个 数
欧拉函数是乘(积)性函数,所以对于两个任意互素的n,m都存在 f(nm)=f(n)f(m) f ( n ∗ m ) = f ( n ) ∗ f ( m )
(乘性函数性质)。(对于任意正整数n,m都存在 f(nm)==f(n)f(m) f ( n ∗ m ) == f ( n ) ∗ f ( m ) ,就是完全乘性函数)

poj3090
https://blog.csdn.net/zhang20072844/article/details/8108727
给定一个坐标系,当从 (0,0) ( 0 , 0 ) 到$$(x,y)的直线不经过任何点时,称$(x,y)$是可见的,给定一个n*n大小的区域,$0<=x<=n,0<=y<=n$问有多少点是可见的。
发现经过的点满足(x/k,y/k),那么当x,y互质时,就可以不经过其他点。
但是斜率为1时是例外(自己和自己肯定不互质)。所以要加上
这里写图片描述
这里写图片描述

#include <iostream>
#include <cstdio>
using namespace std;
/*


*/
const int maxn=1e6+5;
int euler(int n){ //返回euler(n)
     int res=n,a=n;
     for(int i=2;i*i<=a;i++){
         if(a%i==0){
             res=res/i*(i-1);//先进行除法是为了防止中间数据的溢出
             while(a%i==0) a/=i;
         }
     }
     if(a>1) res=res/a*(a-1);
     return res;
}
int phi_get(int n){
    int rea=n;
    for(int i=2;i<=n;i++){
        if(n%i==0){
           rea-=rea/i;
           do n/=i;
           while (n%i==0);
        }
    }
    return rea;
}
long long phi[maxn];
int db_phi(){
    for(int i=1;i<maxn;i++)
        phi[i]=i;
    for(int i=2;i<maxn;i+=2)
        phi[i]/=2;
     for(int i=3;i<maxn;i+=2)
        if(phi[i]==i){
            for(int j=i;j<maxn;j+=i){
                phi[j]=phi[j]/(i)*(i-1);
            }
        }

    return 0;
}
int main(){
    int n;
    db_phi();
    for(int i=2;i<maxn;i++)
        phi[i]+=phi[i-1];
        int tim=1;
        int t;
        scanf("%d",&t);
    while(t--){
          scanf("%d",&n);
          printf("%d %d %lld\n",tim++,n,phi[n]*2+1);

    }

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值