欧拉函数 BZOJ2705
2024-09-06 22:04:43
2705: [SDOI2012]Longge的问题
Time Limit: 3 Sec Memory Limit: 128 MB
Submit: 3154 Solved: 1968
[Submit][Status][Discuss]
Description
Longge的数学成绩非常好,并且他非常乐于挑战高难度的数学问题。现在问题来了:给定一个整数N,你需要求出∑gcd(i, N)(1<=i <=N)。
Input
一个整数,为N。
Output
一个整数,为所求的答案。
Sample Input
6
Sample Output
15
枚举n的因子,对于一个因子x,求与n只有这一个因子x的数目,显然如果暴力的话就是for(int i=x;i<=n;i+=x)然后判断每个i是否与n只有一个因子,从而求得数目然后乘上x。
可以用欧拉函数简化这一过程,因子为x,那么与他成对那个就是y=n/x。我们只需求出小于y并与y互质的数目就可以了,因为与y互质,那么与k*y(显然ky可以等于n)仍然互质,也就是说找出来的每个z。必定满足gcd(n,z)==1且z*x<n,那么gcd(n,z*x)肯定就只有x这一个因子了,从而简化了过程
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
LL phi(LL x)
{
LL ans=x;
for(LL i=; i*i<=x; ++i)
{
if(x%i==) ans=ans*(i-)/i;
while(x%i==) x/=i;
}
if(x>) ans=ans*(x-)/x;
return ans;
}
int main()
{
LL n;
scanf("%lld",&n);
LL ans=;
for(LL i=sqrt(n); i>=; --i)
{
if(n%i==)
{
ans+=phi(n/i)*i;
if(i*i!=n) ans+=phi(i)*(n/i);
}
}
printf("%lld\n",ans);
}
最新文章
- Ie8+,强制默认使用ie8模式
- 使用Fiddler对Android或者iOS设备进行抓包
- (原创)Python文件与文件系统系列(4)——文件描述字操作
- heritrix
- js基础例子购物车升级版(未优化版)
- ES6新特性之Symbol使用细节
- vmvare入门(1)使用移动,不要使用复制
- <;ROS>; message_filters 对齐多种传感器数据的时间戳
- 01 前言/基础设施 - DevOps之路
- Docker防主机意外断电导致容器实例无法驱动解决方案:UPS || write barrier || 上btrfs定期snapshot
- Django框架之第三篇模板语法(重要!!!)
- PyCharm选择性忽略PEP8代码风格警告信息
- TensorFlow 运行模型--会话(Session)
- AI 随机梯度下降(SGD)
- 十一. Python基础(11)—补充: 作用域 & 装饰器
- Redis 集群配置
- Python之Scrapy遇见个坑
- ie高版本浏览器不支持velocity的问题解决
- [CISCO] 交换机间链路聚合端口聚合
- Effective C++笔记(二):构造/析构/赋值运算
热门文章
- CentOS7虚拟机安装vmtools
- 使用cpplint检测代码规范
- keep-alive的深入理解与使用(配合router-view缓存整个路由页面)
- The Preliminary Contest for ICPC Asia Xuzhou 2019 徐州网络赛 XKC's basketball team
- 【原创】Linux Mutex机制分析
- 面试中的volatile关键字
- Https双向验证与Springboot整合测试-人来人往我只认你
- weak_ptr
- Programming Languages_04 Deferred Substitution
- JWT安全问题