Longge的问题 [Bzoj 2705,SDOI2012]

45 篇文章 0 订阅
33 篇文章 0 订阅

题目地址请点击——


Longge的问题


问题描述

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


输入描述

一个整数,为 N


输出描述

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


样例输入

6


样例输出

15


HINT

对于 60% 的数据, 0<N<=216

对于 100% 的数据, 0<N<=232


Solution

x1 x2 x3 ,……, xk n k 个因数, f(i) 表示满足 gcd(j,n)=i (1<=j<=n) j 的个数。

 ans=ki=1f(xi)xi

显然, f(1)=φ(n)

那么,如何计算 f(k) (k>1) 呢?

 gcd(j,n)=i (1<=j<=n)gcd(ji,ni)=1f(i)=φ(ni)

 ans=ki=1φ(nxi)xi


Code

[cpp]
  1. #include <iostream>  
  2. #include <cstdio>  
  3. #include <cmath>  
  4.   
  5. #define LL long long  
  6.   
  7. using namespace std;  
  8.   
  9. LL n,sqr,ans;  
  10.   
  11. LL phi(LL x){  
  12.     LL tmp=x,tmp2=x,sqr=(LL)sqrt((double)x);  
  13.     for(LL i=2;i<=sqr;i++){  
  14.         if(x%i==0){  
  15.             tmp=tmp*(i-1)/i;  
  16.             while(x%i==0)x/=i;  
  17.         }  
  18.     }  
  19.     if(x!=1)tmp=tmp*(x-1)/x;  
  20.     return tmp;  
  21. }  
  22.   
  23. int main(){  
  24.     scanf(”%lld”,&n);  
  25.     sqr=(LL)sqrt((double)n);  
  26.     for(LL i=1;i<=sqr;i++)  
  27.         if(!(n%i)){  
  28.             ans+=i*phi(n/i);  
  29.             if(i!=n/i)ans+=(n/i)*phi(i);  
  30.         }  
  31.     printf(”%lld\n”,ans);  
  32.     return 0;  
  33. }  
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值