[SDOi2012]Longge的问题

题目描述

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

输入输出格式

输入格式:

一个整数,为N。

输出格式:

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

输入输出样例

输入样例#1:
6
输出样例#1:
15

说明

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

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

题解

求所有GCD(i,n)的值

枚举出n的所有因数,设为ai,时间复杂度为O(√n)

GCD(i/ai,n/ai)=1,则转化为求n/ai的欧拉函数

将求出的所有欧拉函数之和作为答案

因为n<=2^31,所以O(n)求欧拉函数也不行

用O(√n)的时间在线求出欧拉函数

 Φ=k*(1-1/p1)*(1-1/p2)....(1-1/pk)

p为质因数

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<cmath>
 6 using namespace std;
 7 long long ans,n,m;
 8 long long phi(long long x)
 9 {int i;
10     long long s=x;
11     int l=sqrt(x);
12     for (i=2;i<=l;i++)
13     {
14         if (x%i==0)
15         {
16             s=s/i*(i-1);
17             while (x%i==0) x=x/i;
18         }
19     }
20     if (x>1) s=s/x*(x-1);
21     return s;
22 }
23 int main()
24 {int i;
25     cin>>n;
26     m=sqrt(n);
27      for (i=1;i<=m;i++)
28      {
29             if (n%i==0)
30             {
31               ans+=i*phi(n/i);
32               if (i*i<n) ans+=(n/i)*phi(i);
33             }
34      }
35  cout<<ans;    
36 }

 

posted @ 2017-07-08 21:38  Z-Y-Y-S  阅读(227)  评论(0编辑  收藏  举报