【河北省队互测】 gcd BZOJ 2818

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

思路

最近看了很多关于gcd和mod的题目。

通过最近几道题目了解了很多=。=

首先有这么一个性质:如果a∈[1,n],b∈[1,m],那么gcd(a,b)|k的有(n/k)*(m/k)组。

那么令f[x]为gcd(a,b)==k的组数,f[k]=(n/k)*(m/k)-f[2k]-f[3k]-f[4k]……

对于这一题来说。。好像是并不可以过的。

那么就有别的性质:

如果a,b∈[1,n],gcd(a,b)==k的组数等价于a,b∈[1,n/k],gcd(a,b)==1的组数。

这就很好求了吧,就是1->n的phi值之和(欧拉函数)*2-1。

首先每组数必须要算两遍,比如(3,5)和(5,3),所以要*2。然后(1,1)不要算两遍,所以再-1。

然后就是如何求出1-n中所有的质数以及欧拉函数了。现场学习线性筛。。

其实我完全不理解啊。。先记住好了。。核心代码如下:

 1 phi[1]=1;memset(is_prime,true,sizeof(is_prime));
 2 for(int i=2;i<=n;i++){
 3     if (is_prime[i]){
 4        phi[i]=i-1;
 5        prime[++cnt]=i;
 6     }
 7     for(int j=1;j<=cnt&&i*prime[j]<=n;j++){
 8        is_prime[i*prime[j]]=false;
 9        if (i%prime[j]!=0)  phi[i*prime[j]]=phi[i]*(prime[j]-1);
10        else{
11          phi[i*prime[j]]=phi[i]*prime[j];
12          break;
13        }
14     }
15 }

线性筛

应该没写错吧。。为了加强记忆默写的。。如果有问题就看下面的那个版本吧,那个是AC了的。

 1 #include <iostream>
 2 #include <cstring>
 3 #include <string>
 4 #include <cstdio>
 5 #include <cstdlib>
 6 #include <cmath>
 7 #include <algorithm>
 8 #include <queue>
 9 #include <stack>
10 #include <map>
11 #include <set>
12 #include <list>
13 #include <vector>
14 #include <ctime>
15 #include <functional>
16 #define pritnf printf
17 #define scafn scanf
18 #define sacnf scanf
19 #define For(i,j,k) for(int i=(j);i<=(k);(i)++)
20 #define Clear(a) memset(a,0,sizeof(a))
21 using namespace std;
22 typedef unsigned int Uint;
23 const int INF=0x3fffffff;
24 ///==============struct declaration==============
25
26 ///==============var declaration=================
27 const int MAXN=10000050;
28 int n,tot=0,ans=0;
29 int prime[MAXN];
30 long long phi[MAXN];
31 bool is_prime[MAXN];
32 ///==============function declaration============
33 void Init();
34 ///==============main code=======================
35 int main()
36 {
37 //#define FILE__
38 #ifdef FILE__
39    freopen("input","r",stdin);
40    freopen("output","w",stdout);
41 #endif
42    scanf("%d",&n);
43    Init();
44    for(int i=1;i<=n;i++) phi[i]+=phi[i-1];
45    long long ans=0;
46    for(int i=1;i<=tot;i++)
47       ans+=phi[n/prime[i]]*2-1;
48    printf("%lld\n",ans);
49    return 0;
50 }
51 ///================fuction code====================
52 void Init(){
53    memset(is_prime,true,sizeof(is_prime));phi[1]=1;
54    for(int i=2;i<=n;i++){
55       if (is_prime[i]){
56          phi[i]=i-1;
57          prime[++tot]=i;
58       }
59       for(int j=1;j<=tot;j++){
60          if (i*prime[j]>n)   break;
61          is_prime[i*prime[j]]=false;
62          if (i%prime[j]==0){
63             phi[i*prime[j]]=phi[i]*prime[j];
64             break;
65          }
66          else
67             phi[i*prime[j]]=phi[i]*(prime[j]-1);
68       }
69    }
70 }

BZOJ2818

不要问我那些性质是为什么。。我也布吉岛(╯‵□′)╯︵┻━┻

时间: 2024-10-09 06:18:50

【河北省队互测】 gcd BZOJ 2818的相关文章

【2012河南省队互测】【COGS930】找第k小的数

题目描述 看到很短的题目会让人心情愉悦,所以给出一个长度为N的序列A1,A2,A3,-,AN, 现在有M个询问,每个询问都是Ai-Aj中第k小的数等于多少. 输入格式 第一行两个正整数N,M. 第二行N个数,表示序列A1,A2,-,AN. 紧着的M行,每行三个正整数i,j,k(k≤j-i+1),表示 询问Ai-Aj中第k小的数等于多少. 输出格式 共输出M行,第i行输出第i个询问的答案. 样例输入1: 4 3 4 1 2 3 1 3 1 2 4 3 1 4 4 样例输出1: 1 3 4 样例输入

[蒟蒻修炼计划][bzoj3670][2014湖北省队互测week2]似乎在梦中见过的样子

Description 已知一个字符串S,求它有多少个形如A+B+A的子串(len(A)>=k,len(B)>=1 ). Input 第一行一个字符串,第二行一个数 k. Output 仅一行一个数,表示满足条件的子串数. Sample Input aaaaa 1 Sample Output 6 HINT 对于 100%的数据:n<=15000 , k<=100,且字符集为所有小写字母. Solution 这道题时限15s,明显O(n^2)可以过.那么如果枚举某一端形成新的子串,用

BZOJ 2818: Gcd

2818: Gcd Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 4443  Solved: 1960[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&

BZOJ 2818 Gcd (莫比乌斯反演 或 欧拉函数)

2818: Gcd Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 2534  Solved: 1129 [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)

BZOJ 2818: Gcd区间内最大公约数 为素数的对数(欧拉函数的应用)

传送门 2818: Gcd Time Limit: 10 Sec Memory Limit: 256 MB Submit: 3649 Solved: 1605 [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,

BZOJ 2818 Gcd 线性欧拉筛(Eratosthenes筛)

题目大意:给定整数N(N <= 1e7),求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对.. 思路:推一推. 设gcd(x,y) = p,则x / p与y / p互质 问题就转化成了N / p中有多少个数互质,然后累加就可以了. =>对于任意a,b,a <= N / p,b <= N / p,且a与b互质 =>gcd(a,b) == 1 现在问题就很明显了,看到这个形式就很容易想到欧拉函数,求一下phi,算一下前缀和,累加. 注意这里求欧拉一

小组互测评论

时间:2014年5月9号 互测小组:本组与刘铸辉(组长)组 第一版本互测初步评论: 杨波:整体界面很好,要实现的基本功能实现了: 崔海营:日程录入模块实现的很好,调用了系统设计: 周亚豪:每周日历表这个模块导入效果不错,整体界面良好: 蔡容玉:日程录入模块实现了,但是好像录入了后在每天时间表的事件中没有及时更新: 闵芮:界面较简便,功能不错:期待后续版本: 张丹丹:软件界面不美观,手机屏幕利用率不高,但总体功能比较完善,对学生有一定的实用性. 高琪:界面清晰,功能明确,但是希望界面更好看:

bzoj 2818 GCD 数论 欧拉函数

bzoj[2818]Gcd 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 题解一(自己yy) phi[i]表示与x互质的数的个数 即gcd(x,y)=1 1<=y<x ∴对于x,y 若a为素数 则gcd(xa,

bzoj 2818: Gcd GCD(a,b) = 素数

2818: Gcd Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1566  Solved: 691[Submit][Status] 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<=