POJ 2480 欧拉函数的运用

本文详细介绍了如何通过优化算法和进行特定情况的特判来解决POJ2480问题,提高了程序的运行效率。通过引入素数特判,最终使程序运行速度提升至360MS。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:http://poj.org/problem?id=2480

这个题我很早就提交过了,但是之前不知到是哪儿膜拜来的代码。。

今天别人问我,我又回去看了看,发现这个题目已经不是那么难了

按照自己的思路写了写,先开始一直莫名的TLE,后来把n为素数的情况特判了一下

于是就360MS卡过去了。。。


我的代码:

#include<stdio.h> typedef long long LL; LL num[70000]; LL eular(LL n) { LL i,ret=1; for(i=2;i*i<=n;i++) { if(n%i==0) { n=n/i; ret=ret*(i-1); while(n%i==0) { n=n/i; ret=ret*i; } } } if(n>1) ret=ret*(n-1); return ret; } int main() { LL i,n,k,ans; while(scanf("%lld",&n)!=EOF) { k=0,ans=0; for(i=1;i*i<n;i++) { if(n%i==0) { num[k++]=i; num[k++]=n/i; } } if(i*i==n) num[k++]=i; if(k==2) { printf("%lld\n",2*n-1); continue; } for(i=0;i<k;i++) ans=ans+num[i]*eular(n/num[i]); printf("%lld\n",ans); } return 0; }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值