BZOJ 2705 Longge的问题(欧拉函数)
2016-03-17 17:48
281 查看
2705: [SDOI2012]Longge的问题
Time Limit: 3 Sec Memory Limit:128 MB
Submit: 1966 Solved: 1230
[Submit][Status][Discuss]
Description
[align=left]Longge的数学成绩非常好,并且他非常乐于挑战高难度的数学问题。现在问题来了:给定一个整数N,你需要求出∑gcd(i, N)(1<=i <=N)。[/align]Input
[align=left]一个整数,为N。[/align]Output
[align=left]一个整数,为所求的答案。[/align]Sample Input
6Sample Output
15HINT
【数据范围】对于60%的数据,0<N<=2^16。
对于100%的数据,0<N<=2^32。
题解:这道题目求的是∑gcd(i,n) (1<=i<=n)。 枚举n的约数k,令s(k)为满足gcd(i,n)=k的个数,所以ans=∑(k*s(k))。
因为gcd(i,n)=k,所以gcd(i/k,n/k)=1,于是s(k)=euler(n/k)。
代码如下:
#include<cstdio>
#include<cstring>
#include<cmath>
#define LL long long
LL m;
LL euler(LL k)
{
LL res=k,i;
for(i=2;i*i<=k;++i)
{
if(k%i==0)
res=res/i*(i-1);
while(k%i==0)
k/=i;
}
if(k>1)
res=res/k*(k-1);
return res;
}
int main()
{
LL ans,n,i;
while(scanf("%lld",&n)!=EOF)
{
m=sqrt(n);
ans=0;
for(i=1;i<=m;++i)
{
if(n%i==0)
{
ans+=(LL)i*euler(n/i);
if(i*i<n)
ans+=(LL)(n/i)*euler(i);
}
}
printf("%lld\n",ans);
}
}
相关文章推荐
- 浅析android应用增量升级
- jQuery基础知识整理(1)
- 覆盖jar 类 优先级高于jar == Debug jar包 java技巧
- 数据持久化-CoreData、SQLite、FMDB
- android 多图层叠加--土巴兔装修 DIY设计图层
- 自定义的LinearLayout 使用报错 android.view.InflateException: Binary XML file line #3: Error inflating class
- DEDECMS后台上传banner图控制图片轮播
- 『奇葩问题集锦』Cannot find module 'webpack/lib/node/NodeTemplatePlugin'
- Flask web开发 请求拦截和预处理
- php常用方法总结(持续更新中)
- 解决android studio Error:SSL peer shut down incorrectly
- eclipse环境变量设置
- android 图片缓存LruCache(二)
- php判断变量类型
- Django中的Ajax
- 如何在linux安装软件的几种方法
- DisUnity——Unity3D反编译资源提取利刃
- Activity基本类分析
- wim
- 【字符编码】字符编码 && Base64编码算法