思路:就是对于某个数q,跟他互质的数p,kp和kq的最大公约数是k,那么这个数能组成的答案的数量就是phi[i]乘以某个质数,且乘积小于n

基于这种思路写下这个代码

#include <cstdio>
#include <iostream>
#include <iomanip>
#include <string>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <set>
#include <vector>
#include <map>
#include <algorithm>
#include <cmath>
#include <stack>#define INF 0x3f3f3f3f
#define IMAX 2147483646
#define LINF 0x3f3f3f3f3f3f3f3f
#define ll long long
#define ull unsigned long long
#define uint unsigned intusing namespace std;const int maxn = 1e7 + 10;int n;
int phi[maxn], v[maxn], pre[maxn],m;void euler(int n) {for (int i = 1; i <= n; i++)phi[i] = i;for (int i = 2; i <= n; i++) if (phi[i] == i) for (int j = i; j <= n; j += i) phi[j] = phi[j] / i * (i - 1);
}void prime(int n) {m = 0;for (int i = 2; i <= n; i++) {if (v[i] == 0)v[i] = i, pre[++m] = i;for (int j = 1; j <= m; j++) {if (pre[j] > v[i] || pre[j] > n / i)break;v[i*pre[j]] = pre[j];}}
}int main() {scanf("%d", &n);prime(n);euler(n);ll ans = m;//质数自己和自己的gcd等于质数for (int i = 2; i <= n; i++) for (int j = 1; pre[j] * i <= n && j <= m; j++)ans += phi[i] * 2;//题目上说两两组合可以互换,所以要乘2printf("%d\n", ans);return 0;
}

但是这样复杂度是O(lgn*n),超时,

使用基于线性方法去求欧拉函数,进一步可以写出这样的代码。

#include <cstdio>
#include <iostream>
#include <iomanip>
#include <string>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <set>
#include <vector>
#include <map>
#include <algorithm>
#include <cmath>
#include <stack>#define INF 0x3f3f3f3f
#define IMAX 2147483646
#define LINF 0x3f3f3f3f3f3f3f3f
#define ll long long
#define ull unsigned long long
#define uint unsigned intusing namespace std;const int maxn = 1e7 + 10;
ll phi[maxn];
int v[maxn], pre[maxn], m;
int n;int main() {scanf("%d", &n);phi[1] = 1;for (int i = 2; i <= n; i++) {if (!v[i]) {v[i] = i;pre[++m] = i;phi[i] = i - 1;}for (int j = 1; j <= m; j++) {if (pre[j] > v[i] || pre[j] * i > n) break;v[pre[j] * i] = pre[j];phi[pre[j] * i] = phi[i] * (i % pre[j] ? pre[j] - 1 : pre[j]);}phi[i] += phi[i - 1];//phi表示前i个欧拉函数的和}ll ans = 0;for (int i = 1; i <= m; i++) ans += phi[n / pre[i]];printf("%lld\n", ans * 2 - m);return 0;
}

bzoj 2818 欧拉函数相关推荐

  1. BZOJ - 2186 欧拉函数

    题目的意思大概是求1~N!中和M!互质的数的个数 因为对欧拉函数理解不够深刻所以我是分析得到结果的: 当N<=M的时候显然符合要求的数的个数为0: 当N>M的时候我们要求的是1~N!中不含 ...

  2. BZOJ 4802: 欧拉函数(大数因数分解算法 Pollard_rho 和素数测试算法 Miller_Rabin)

    Description 已知N,求phi(N) Input 正整数N.N<=10^18 Output 输出phi(N) Sample Input 8 Sample Output 4 Soluti ...

  3. bzoj 4805: 欧拉函数求和

    Time Limit: 15 Sec  Memory Limit: 256 MB Submit: 539  Solved: 304 [Submit][Status][Discuss] Descript ...

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

    传送门 2818: Gcd Time Limit: 10 Sec Memory Limit: 256 MB Submit: 3649 Solved: 1605 [Submit][Status][Dis ...

  5. bzoj 1409 Password 矩阵快速幂+欧拉函数

    可以发现,该数组的mi就是斐波那契数列 所以要矩阵快速幂搞出第n位 但是斐波那契数列上涨的很快,这就需要欧拉定理了 p^phi(q)%q=1(gcd(p,q)==1) p是素数,所以可以用 然后需要5 ...

  6. bzoj 3884: 上帝与集合的正确用法(欧拉函数)

    3884: 上帝与集合的正确用法 Time Limit: 5 Sec  Memory Limit: 128 MB Submit: 2574  Solved: 1151 [Submit][Status] ...

  7. bzoj 2705: [SDOI2012]Longge的问题(欧拉函数)

    2705: [SDOI2012]Longge的问题 Time Limit: 3 Sec  Memory Limit: 128 MB Submit: 3077  Solved: 1914 [Submit ...

  8. bzoj 5245: [Fjwc2018]欧拉函数 线段树+bitset

    题意 对于正整数 n,定义欧拉函数 φ(n) 为小于等于 n 且与 n 互质的正整数个数.例如 φ(1) = 1, φ(8) = 4. 给定正整数序列 a1, a2, · · · , an,请依次执行 ...

  9. poj2154-color-polyan次二面体+欧拉函数优化

    N<=1e9,O(nlogn)的做法会超时.从枚举置换转变为枚举轮换长度,然后可以利用欧拉函数,把复杂度变为O(√n * logn) 1 /*-------------------------- ...

最新文章

  1. string之substring的用法
  2. 关于精密空调,你需要了解的都在这里!
  3. QT的QMultiMap类的使用
  4. [bzoj4236]JOIOJI
  5. 面试:TCP协议面试10连问,总会用得到,值得收藏!
  6. 人性化的Ruby计数取值
  7. linux uwsgi 非root,ubuntu-除非root用户,否则uWSGI Emperor权限被拒...
  8. axios发post请求,后端接收不到参数的问题
  9. Ubuntu系统搭建以太坊开发平台过程
  10. 190615每日一句;每个学生都不能错过的9个人生忠告; 什么样心态的人,才能取得最终的成功
  11. win32 api应用如何输出日志log Windows程序设计 visualstudio vs无控制台如何输出
  12. KITTI立体匹配数据集解析
  13. HTML5轮播图全代码
  14. 如何判断一个文件是否是jpeg格式?
  15. 【STM32学习】(28)STM32实现光照度采集(标准库和HAL库实现)
  16. Balsamiq mockups
  17. 浏览器绑定快捷键KeyboardEvent
  18. unpacking of archive failed: cpio: lstat failed - Not a directory
  19. BIM模型文件下载——8层综合办公楼BIM项目Revit模型(建筑、结构、暖通、电气、给排水、MEP)
  20. 怎么把html换成gif,怎么将mp4转换成gif 把mp4转换成高清gif的方法

热门文章

  1. Android音视频点/直播模块开发
  2. python实现舒尔特方格
  3. php icon素材,Feather Icon - 简单漂亮的免费开源图标库
  4. 大数据工作流开源系统之DRAKE
  5. 安卓设置字符串样式,字符串中部分字体样式
  6. 【龙讯module小课堂】浅谈对gap的认识:PWmat中修正gap的module
  7. 微机期末速通---不挂科版
  8. 【翻译】CSPNet: A New Backbone that can Enhance Learning Capability of CNN
  9. 微信小程序:wxml中写js语句的方法
  10. Java SE 第三讲(原生数据类型使用陷阱 Pitfall of Primitive Data Type)