【BZOJ 2818】 GCD
【题目链接】
【算法】
线性筛出不大于N的所有素数,枚举gcd(x,y)(设为p),问题转化为求(x,y)=p的个数
设x=x'p, y=y'p,那么有(x,y)=1且1≤x,y≤N/p
转化为求(x,y)=1且1≤x,y≤n的个数
求(x,y)=1且1≤x,y≤N的个数:
若x≥y,对于x=1..n,有ϕ(x)个y满足(x,y)=1
若x≤y,对于y=1..n,有ϕ(y)个x满足(x,y)=1
若x=y,只有一种情况:(x=1, y=1)
所以答案为2(ϕ(1)+...+ϕ(n))-1
线性筛筛出欧拉函数、预处理前缀和即可
【代码】
- #include<bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- const ll MAXN = 1e7;
- ll i,N,tot,ans;
- ll sum[MAXN+];
- int prime[MAXN+],phi[MAXN+];
- template <typename T> inline void read(T &x) {
- ll f = ; x = ;
- char c = getchar();
- for (; !isdigit(c); c = getchar()) { if (c == '-') f = -f; }
- for (; isdigit(c); c = getchar()) x = (x << ) + (x << ) + c - '';
- x *= f;
- }
- template <typename T> inline void write(T x) {
- if (x < ) { putchar('-'); x = -x; }
- if (x > ) write(x/);
- putchar(x%+'');
- }
- template <typename T> inline void writeln(T x) {
- write(x);
- puts("");
- }
- inline void sieve(ll n) {
- ll i,j,tmp;
- static ll f[MAXN+];
- phi[] = ;
- for (i = ; i <= n; i++) {
- if (!f[i]) {
- prime[++tot] = f[i] = i;
- phi[i] = i - ;
- }
- for (j = ; j <= tot; j++) {
- tmp = i * prime[j];
- if (tmp > n) break;
- f[tmp] = prime[j];
- phi[tmp] = (prime[j] - (prime[j] < f[i])) * phi[i];
- if (f[i] == prime[j]) break;
- }
- }
- }
- int main() {
- read(N);
- sieve(N);
- for (i = ; i <= N; i++) sum[i] = sum[i-] + phi[i];
- for (i = ; i <= tot; i++) ans = ans + * sum[N/prime[i]] - ;
- writeln(ans);
- return ;
- }
【BZOJ 2818】 GCD的更多相关文章
- 【BZOJ 2818】gcd 欧拉筛
枚举小于n的质数,然后再枚举小于n/这个质数的Φ的和,乘2再加1即可.乘2是因为xy互换是另一组解,加1是x==y==1时的一组解.至于求和我们只需处理前缀和就可以啦,注意Φ(1)的值不能包含在前缀和 ...
- 【BZOJ 2818】Gcd - 筛法求素数&phi()
题目描述 给定整数,求且为素数的数对有多少对. 分析 首先筛出所有的素数. 我们考虑枚举素数p,统计满足的个数,等价于统计的个数,即统计以内满足互质的有序数对个数. 不难发现,也就是说,我们只要预处理 ...
- 【BZOJ 1150】 1150: [CTSC2007]数据备份Backup (贪心+优先队列+双向链表)
1150: [CTSC2007]数据备份Backup Description 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设 ...
- Kruskal算法及其类似原理的应用——【BZOJ 3654】tree&&【BZOJ 3624】[Apio2008]免费道路
首先让我们来介绍Krukal算法,他是一种用来求解最小生成树问题的算法,首先把边按边权排序,然后贪心得从最小开始往大里取,只要那个边的两端点暂时还没有在一个联通块里,我们就把他相连,只要这个图里存在最 ...
- 【BZOJ 2957】楼房重建&&Codechef COT5 Count on a Treap&&【NOIP模拟赛】Weed 线段树的分治维护
线段树是一种作用于静态区间上的数据结构,可以高效查询连续区间和单点,类似于一种静态的分治.他最迷人的地方在于“lazy标记”,对于lazy标记一般随我们从父区间进入子区间而下传,最终给到叶子节点,但还 ...
- LCA 【bzoj 4281】 [ONTAK2015]Związek Harcerstwa Bajtockiego
[bzoj 4281] [ONTAK2015]Związek Harcerstwa Bajtockiego Description 给定一棵有n个点的无根树,相邻的点之间的距离为1,一开始你位于m点. ...
- 【BZOJ】【2818】Gcd
欧拉函数/莫比乌斯函数 嗯……跟2190很像的一道题,在上道题的基础上我们很容易就想到先求出gcd(x,y)==1的组,然后再让x*=prime[i],y*=prime[i]这样它们的最大公约数就是p ...
- 【BZOJ 1191】 [Apio2010]特别行动队 (斜率优化)
dsy1911: [Apio2010]特别行动队 [题目描述] 有n个数,分成连续的若干段,每段的分数为a*x^2+b*x+c(a,b,c是给出的常数),其中x为该段的各个数的和.求如何分才能使得各个 ...
- 【BZOJ 1096】 [ZJOI2007]仓库建设 (斜率优化)
1096: [ZJOI2007]仓库建设 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3940 Solved: 1736 Description ...
随机推荐
- Servlet(生命周期)
<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" ...
- activiti实现的请假流程
直接上图,还是有点复杂的
- Android 学习笔记---获取RadioGroup的选定值
1,获取RadioGroup控件: RadioGroup radioGroup = (RadioGroup)findViewById(R.id.myRadioGroup); 2,获取RadioButt ...
- 【Todo】git的fast forward & git命令学习 & no-ff
git的fast-forward在之前的文章有介绍过,但是介绍的不细: http://www.cnblogs.com/charlesblc/p/5953066.html fast-forward方式就 ...
- JNI之—— Eclipse配置C/C++开发环境
转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46622173 开发环境:Eclipse3.2.CDT3.1.MinGW5.1 1. ...
- BUPT复试专题—最值问题(2013计院)
题目描述 给出N个数,求出这N个数中最大值和次大值.注意这里的次大值必须严格小于最大值.输入保证N个数中至少存在两个不同的数. 输入格式 第一行为测试数据的组数T(T≤20).请注意,任意两组测试数据 ...
- Android开发之入口Activity
Android开发之入口Activity Adnroid App是怎样确定入口Activity的? 难道就由于class的类名叫MainActivity,布局文件叫activity_main.xml? ...
- mtk机型的一次救砖经历
在recovery里清除了data,cache,system三个分区,没有刷机,重启到bootloader,准备另刷recovery. 有急事走开了,回来时发现手机黑屏,无论什么组合键都没反应,以为是 ...
- attribute constructor&destructor
attribute constructor&destructor 在看openwrt里libnl-tiny这个库的时候,遇到了C里面的构造函数这个概念. static void __init ...
- mysql使用“.frm”文件恢复表结构
mysql创建每张表后都会在“mysql安装目录/data/数据库名/”目录下创建一个“表名.frm”文件. 该.frm文件并不能直接打开,但是它可以帮助你恢复你的表结构~~ 具体操作如下: 我现在准 ...