c语言求互质数个数,欧拉函数——求小于N且与N互质的数的个数

对一个正整数N,欧拉函数是小于N且与N互质的数的个数.。

题目: https://www.luogu.org/problemnew/show/P2158

题解:

裸的欧拉函数题。e(i)为有多少个小于i的与i互质的数。可以把点看做坐标轴。求左下角的点是(1,1),然后求有多少个点(1,1)相连斜率不同的一次函数y=kx。求k的个数。因为k=y/x。想要y/x不同,y与x一定互质(k=y/x=yz/xz),不同的互质数相除又一定不同。所以只要求在n范围内有多少对x,y互质。就相当于求ans+=e[i] (2<=i<=n)。第一列和第一行特殊考虑,ans=2。n–。再求ans+=e[i] (2<=i<=n)即可。

#includeusing namespace std;

int main()

{

int n;

int e[40005];

cin>>n;

if(n==1)

{//特判

cout<<0;

return 0;

}

for(int i=1;i<=n;i++) e[i]=i;

for(int i=2;i<=n;i++)

if(e[i]==i){

for(int j=i;j<=n;j+=i)

e[j]=e[j]/i*(i-1);

}

int ans=0;

for(int i=2;i

6a89b81485255174fade630378072afc.png

模板:

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;

}

//筛选法打欧拉函数表

#define Max 1000001

int euler[Max+1];

void Init(){

for(int i=1;i<=Max;i++)

euler[i]=i;

for(int i=2;i<=Max;i++)

if(euler[i]==i)

for(int j=i;j<=Max;j+=i)

euler[j]=euler[j]/i*(i-1);//先进行除法是为了防止中间数据的溢出

}

https://blog.csdn.net/nan81962325/article/details/79964951

https://blog.csdn.net/qq_39520417/article/details/81940687

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值