评论

收藏

[C++] 【BZOJ】【2818】Gcd

编程语言 编程语言 发布于:2021-08-04 14:51 | 阅读数:324 | 评论:0

欧拉函数/莫比乌斯函数嗯……跟2190很像的一道题,在上道题的基础上我们很容易就想到先求出gcd(x,y)==1的组,然后再让x*=prime,y*=prime这样它们的最大公约数就是prime了……
当然我们完全没必要这样做……对于每个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.
DSC0000.gif DSC0001.gif
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]



关注下面的标签,发现更多相似文章