2818: Gcd

Time Limit: 10 Sec  Memory Limit: 256 MB
Submit: 4436  Solved: 1957
[Submit][Status][Discuss]

Description

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

1<=N<=10^7


uva上做过gcd(x,y)=1的题

gcd(x,y)=p ---> gcd(x/p,y/p)=1

每个质数做一遍行了

答案是欧拉函数的前缀和*2-质数的个数,因为(p,p)算一组

朴素的两个筛法写下来要5000ms

然后就学了一个新技能:欧拉筛法同时求欧拉函数

我们要证明:

若p是x的约数,则Φ(x*p)=Φ(x)*p.
若p不是x的约数,则Φ(x*p)=Φ(x)*(p-1).  

欧拉函数是一个积性函数,且phi(p)=p-1 p is prime

若f(n)为数论函数,且f(1)=1,对于互质的正整数p,q有f(p⋅q)=f(p)⋅f(q),则称其为积性函数

那么Φ(x*p)=Φ(x)*(p-1)

Φ(p^k)=p^k-p^(k-1)=(p-1)*p^(k-1)
证明:

令n=p^k,小于n的正整数数共有n-1即(p^k-1)个,其中不与p互质的数共[p^(k-1)-1]个(除以p然后下取整.....)
所以Φ(p^k)=(p^k-1)-(p^(k-1)-1)=p^k-p^(k-1) 得证。//定义

Φ(p^k)=(p-1)*p^(k-1)=(p-1)*p^(k-2)*p
Φ(p^(k-1))=(p-1)*p^(k-2)
所以当k>1时,Φ(p^k)=Φ(p^(k-1))*p

得证

复习欧拉筛法:对于任意一个合数,拆成最小质数*某个数字的形式,每个数字只会被筛选一次

2016的国家队论文里有一个语言描述比较好,复制不下来....

那么我们遇到一个数i,如果是素数phi[i]=i-1

然后在枚举i*p[j]时,phi[i]已经知道了,由以上两个式子就可以算出phi[i*p[j]]的值了

更一般的来说,就是因为线性筛的过程中得到了每个数的最小质因子,利用了积性函数的性质

【2016-12-22】上述直接观察也可以

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include <cstring>
  5. using namespace std;
  6. typedef long long ll;
  7. const int N=1e7+;
  8. int n;
  9. bool vis[N];
  10. int p[N],m=;
  11. ll s[N],ans,phi[N];
  12. void sieveprime(){
  13. for(int i=;i<=n;i++){
  14. if(!vis[i]) p[++m]=i;
  15. for(int j=;j<=m&&i*p[j]<=n;j++){
  16. vis[i*p[j]]=;
  17. if(i%p[j]==) break;
  18. }
  19. }
  20. }
  21. void sievephi(){
  22. phi[]=;
  23. for(int i=;i<=n;i++)if(!phi[i]){
  24. for(int j=i;j<=n;j+=i){
  25. if(!phi[j]) phi[j]=j;
  26. phi[j]=phi[j]/i*(i-);
  27. }
  28. }
  29. for(int i=;i<=n;i++) s[i]=s[i-]+phi[i];
  30. }
  31. int main(){
  32. scanf("%d",&n);
  33. sieveprime();
  34. sievephi();
  35. for(int i=;i<=m;i++) ans+=s[n/p[i]];
  36. printf("%lld",ans*-m);
  37. }

朴素

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include <cstring>
  5. using namespace std;
  6. typedef long long ll;
  7. const int N=1e7+;
  8. int n;
  9. bool vis[N];
  10. int p[N],m=;
  11. ll s[N],ans,phi[N];
  12. void sieve(){
  13. phi[]=;
  14. for(int i=;i<=n;i++){
  15. if(!vis[i]){
  16. p[++m]=i;
  17. phi[i]=i-;
  18. }
  19. for(int j=;j<=m&&i*p[j]<=n;j++){
  20. vis[i*p[j]]=;
  21. if(i%p[j]==){
  22. phi[i*p[j]]=phi[i]*p[j];
  23. break;
  24. }
  25. phi[i*p[j]]=phi[i]*(p[j]-);
  26. }
  27. }
  28. for(int i=;i<=n;i++) s[i]=s[i-]+phi[i];
  29. }
  30. int main(){
  31. scanf("%d",&n);
  32. sieve();
  33. for(int i=;i<=m;i++) ans+=s[n/p[i]];
  34. printf("%lld",ans*-m);
  35. }

BZOJ 2818: Gcd [欧拉函数 质数 线性筛]【学习笔记】的更多相关文章

  1. BZOJ 2818 Gcd(欧拉函数+质数筛选)

    2818: Gcd Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 9108  Solved: 4066 [Submit][Status][Discu ...

  2. ACM学习历程—HYSBZ 2818 Gcd(欧拉函数 || 莫比乌斯反演)

    Description 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对. Input 一个整数N Output 如题 Sample Input 4 Sam ...

  3. BZOJ-2190 仪仗队 数论+欧拉函数(线性筛)

    今天zky学长讲数论,上午水,舒爽的不行..后来下午直接while(true){懵逼:}死循全程懵逼....(可怕)Thinking Bear. 2190: [SDOI2008]仪仗队 Time Li ...

  4. Poj 2478-Farey Sequence 欧拉函数,素数,线性筛

    Farey Sequence Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 14291   Accepted: 5647 D ...

  5. 洛谷UVA12995 Farey Sequence(欧拉函数,线性筛)

    洛谷题目传送门 分数其实就是一个幌子,实际上就是求互质数对的个数(除开一个特例\((1,1)\)).因为保证了\(a<b\),所以我们把要求的东西拆开看,不就是\(\sum_{i=2}^n\ph ...

  6. 欧拉函数(线性筛)(超好Dong)

    欧拉函数:对于一个正整数n,小于n且和n互质的正整数(包括1)的个数,记作φ(n) . #include <bits/stdc++.h> using namespace std; cons ...

  7. BZOJ2186 [Sdoi2008]沙拉公主的困惑 【数论,欧拉函数,线性筛,乘法逆元】

    2186: [Sdoi2008]沙拉公主的困惑 Time Limit: 10 Sec  Memory Limit: 259 MB Submit: 5003  Solved: 1725 [Submit] ...

  8. Bzoj 2749: [HAOI2012]外星人 欧拉函数,数论,线性筛

    2749: [HAOI2012]外星人 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 568  Solved: 302[Submit][Status][ ...

  9. [bzoj2226][Spoj5971]LCMSum_欧拉函数_线性筛

    LCMSum bzoj-2226 Spoj-5971 题目大意:求$\sum\limits_{i=1}^nlcm(i,n)$ 注释:$1\le n\le 10^6$,$1\le cases \le 3 ...

随机推荐

  1. Python标准模块--asyncio

    1 模块简介 asyncio模块作为一个临时的库,在Python 3.4版本中加入.这意味着,asyncio模块可能做不到向后兼容甚至在后续的Python版本中被删除.根据Python官方文档,asy ...

  2. 初识AngularJS 之 HelloWorld和数据绑定

    1.Hello World 我用的开发工具是   atom   ,大家有需要的话可以找我要安装包嘻嘻 第一步: 写入以下代码: <!DOCTYPE html> <html ng-ap ...

  3. 计算机程序的思维逻辑 (41) - 剖析HashSet

    上节介绍了HashMap,提到了Set接口,Map接口的两个方法keySet和entrySet返回的都是Set,本节,我们来看Set接口的一个重要实现类HashSet. 与HashMap类似,字面上看 ...

  4. 读书笔记--SQL必知必会--Tips

    01 - 如何获取SQL命令帮助信息 官方手册 help 或 help command MariaDB [(none)]> help General information about Mari ...

  5. IIS7.5上的REST服务的Put,Delete操作发生HTTP Error 405.0 - Method Not Allowed 解决方法

    WebDAV 是超文本传输协议 (HTTP) 的一组扩展,为 Internet 上计算机之间的编辑和文件管理提供了标准.利用这个协议用户可以通过Web进行远程的基本文件操作,如拷贝.移动.删除等.在I ...

  6. 账号密码管理系统Access版本

    哈哈,花了我整整五天时间,账号密码管理系统软件终于成功编写完成了.由于我的各大论坛的账号密码特别多,记性又不好.所以一直以来都想要这么一个软件的,但是以前学习的都是面向过程的编程语言,一直无法实现这个 ...

  7. golang枚举类型 - iota用法拾遗

    在c#.java等高级语言中,经常会用到枚举类型来表示状态等.在golang中并没有枚举类型,如何实现枚举呢?首先从枚举的概念入手. 1.枚举类型定义 从百度百科查询解释如下:http://baike ...

  8. scikit-learn预处理实例之一:使用FunctionTransformer选择列

    本例展示怎样在一个管道中使用FunctionTransformer.如果你知道你的数据集的第一主成分与分类任务无关,你可以使用FunctionTransformer选取除PCA转化的数据的第一列之外的 ...

  9. Redis简单案例(四) Session的管理

    负载均衡,这应该是一个永恒的话题,也是一个十分重要的话题.毕竟当网站成长到一定程度,访问量自然也是会跟着增长,这个时候, 一般都会对其进行负载均衡等相应的调整.现如今最常见的应该就是使用Nginx来进 ...

  10. C# 条件编译

    本文导读: C#的预处理器指令从来不会转化为可执行代码的命令,但是会影响编译过程的各个方面,常用的预处理器指令有#define.#undef.#if,#elif,#else和#endif等等,下面介绍 ...