关闭

Longge的问题 [Bzoj 2705,SDOI2012]

99人阅读 评论(0) 收藏 举报
分类:

题目地址请点击——


Longge的问题


问题描述

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


输入描述

一个整数,为 N


输出描述

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


样例输入

6


样例输出

15


HINT

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

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


Solution

x1x2x3,……,xknk 个因数,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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    推荐使用Chrome访问!!!
    个人资料
    • 访问:46706次
    • 积分:2457
    • 等级:
    • 排名:第15105名
    • 原创:193篇
    • 转载:3篇
    • 译文:0篇
    • 评论:9条
    最新评论