【BZOJ】【2818】Gcd

欧拉函数/莫比乌斯函数

  嗯……跟2190很像的一道题,在上道题的基础上我们很容易就想到先求出gcd(x,y)==1的组,然后再让x*=prime[i],y*=prime[i]这样它们的最大公约数就是prime[i]了……

  当然我们完全没必要这样做……对于每个prime[j],计算在(1,n/prime[j])范围内互质的数的对数,记为f[j],那么答案就等于sigma(f[j])

  f[j]的求法还是和以前一样啦~(sigma φ(i))*2+1  (加一是因为类似 5,5 这样两个质数它俩的GCD也是质数)

  UPD:这个由于$\phi(i)$是积性函数,所以互质的对数是可以乘起来的……

 

核心思想在于转化:即把【求(1,n)范围内gcd=prime的对数】转化为【求(1,n/prime)范围内gcd=1的对数】

另外,最后结果会很大……需要用long long.

 

 1 /**************************************************************
 2     Problem: 2818
 3     User: Tunix
 4     Language: C++
 5     Result: Accepted
 6     Time:888 ms
 7     Memory:89164 kb
 8 ****************************************************************/
 9  
10 //BZOJ 2818
11 #include<cstdio>
12 #include<cstring>
13 #include<cstdlib>
14 #include<iostream>
15 #include<algorithm>
16 #define rep(i,n) for(int i=0;i<n;++i)
17 #define F(i,j,n) for(int i=j;i<=n;++i)
18 #define D(i,j,n) for(int i=j;i>=n;--i)
19 using namespace std;
20 int getint(){
21     int v=0,sign=1; char ch=getchar();
22     while(!isdigit(ch)) {if(ch=='-') sign=-1; ch=getchar();}
23     while(isdigit(ch))  {v=v*10+ch-'0'; ch=getchar();}
24     return v*sign;
25 }
26 /*******************template********************/
27 const int N=10000010;
28 typedef long long LL;
29 int prime[N],phi[N],tot=0;
30 bool check[N];
31 void getphi(int n){
32     F(i,0,n) check[i]=0;
33     phi[1]=0;
34     F(i,2,n){
35         if(!check[i]){
36             prime[tot++]=i;
37             phi[i]=i-1;
38         }
39         rep(j,n){
40             if(i*prime[j]>n) break;
41             check[i*prime[j]]=1;
42             if(i%prime[j]==0){
43                 phi[i*prime[j]]=phi[i]*prime[j];
44                 break;
45             }
46             else phi[i*prime[j]]=phi[i]*(prime[j]-1);
47         }
48     }
49 }
50 int main(){
51     int n=getint();
52     getphi(n);
53     LL ans=0;
54     rep(j,tot){
55         LL temp=0;
56         F(i,1,n/prime[j]) temp+=phi[i];
57         ans+=2*(LL)temp+1;
58     }
59     printf("%lld\n",ans);
60     return 0;
61 }
62 
欧拉函数

莫比乌斯函数版本的不会写……这里@一下iwtwiioi,大家可以去看他的代码……

 

2818: Gcd

Time Limit: 10 Sec  Memory Limit: 256 MB
Submit: 2275  Solved: 1027
[Submit][Status][Discuss]

Description

给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的
数对(x,y)有多少对.

Input

一个整数N

Output

如题

Sample Input

4

Sample Output

4

HINT

hint

对于样例(2,2),(2,4),(3,3),(4,2)


1<=N<=10^7

Source

[Submit][Status][Discuss]
posted @ 2015-02-03 18:34  Tunix  阅读(270)  评论(0编辑  收藏  举报