博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj 2705: [SDOI2012]Longge的问题——欧拉定理
阅读量:6990 次
发布时间:2019-06-27

本文共 1092 字,大约阅读时间需要 3 分钟。

Description

Longge的数学成绩非常好,并且他非常乐于挑战高难度的数学问题。现在问题来了:给定一个整数N,你需要求出∑gcd(i, N)(1<=i <=N)。

Input

一个整数,为N。

Output

一个整数,为所求的答案。

Sample Input

6

Sample Output

15

HINT

 

【数据范围】

对于60%的数据,0<N<=2^16。
对于100%的数据,0<N<=2^32。

———————————————————————

这道题如果一个数x gcd(n,x)==y 那么gcd(b/y,x/y)==1

所以我们枚举因数d 求一下1-n/d有多少个数和n/d的gcd为1 这个可以用欧拉函数

#include
#include
#include
#define LL long longconst int M=1e3+7;LL read(){ LL ans=0,f=1,c=getchar(); while(c<'0'||c>'9'){
if(c=='-') f=-1; c=getchar();} while(c>='0'&&c<='9'){ans=ans*10+(c-'0'); c=getchar();} return ans*f;}LL n,v,ans;int p[M],cnt;LL f(LL x){
for(int i=1;i<=cnt;i++)if(x%p[i]==0) x=x/p[i]*(p[i]-1); return x;}int main(){ n=read(); v=n; for(LL x=2;x*x<=v;x++)if(v%x==0){ p[++cnt]=x; while(v%x==0) v/=x; } if(v!=1) p[++cnt]=v; for(LL x=1;x*x<=n;x++)if(n%x==0){ LL y=n/x; ans=ans+y*f(x); if(x!=y) ans=ans+x*f(y); }printf("%lld\n",ans); return 0;}
View Code

 

转载于:https://www.cnblogs.com/lyzuikeai/p/7664991.html

你可能感兴趣的文章
C++银行储蓄程序代码
查看>>
Java 线程池框架核心代码分析
查看>>
第六次作业:素数判断及求和
查看>>
「学习笔记——Linux」Linux软件管理(RPM,Dpkg,APT)
查看>>
Soft NMS
查看>>
Linux命令的那些事(二)
查看>>
强制转https
查看>>
Ubuntu下GTK的安装、编译和测试
查看>>
javascript中window.open()与window.location.href的区别
查看>>
Respond.js的作用
查看>>
FCN笔记(Fully Convolutional Networks for Semantic Segmentation)
查看>>
外部线程停止Java子线程的方法
查看>>
OpenMP并行编程
查看>>
网络编程
查看>>
【ZJOI2016】线段树
查看>>
ActiveMQ-自定义用户验证
查看>>
IOS 项目加入SDL库 --- FFMPEG+SDL学习 之 二
查看>>
mysql的sql文件的备份与还原
查看>>
Java API —— 泛型
查看>>
十三周进度报告
查看>>