BZOJ 4488/4052 gcd】的更多相关文章

思路: 一开始 我是想 对于固定的左端点 从左到右 最多有 log种取值  且单调递减  那不妨倍增预处理+二分GCD在哪变了.. 复杂度O(nlog^2n) gcd最多log种取值.. 好了我们可以暴力了... 复杂度O(nlogn) //By SiriusRen #include <cstdio> #include <algorithm> using namespace std; typedef long long ll; int cases,n,top,temp; ll xx…
Description 给定一个长度为 N 的正整数序列Ai对于其任意一个连续的子序列 {Al,Al+1...Ar},我们定义其权值W(L,R )为其长度与序列中所有元素的最大公约数的乘积,即W(L,R) = (R-L+1) ∗ gcd (Al..Ar). JYY 希望找出权值最大的子序列. Input 输入一行包含一个正整数 N. 接下来一行,包含 N个正整数,表示序列Ai 1 < =  Ai < =  10^12, 1 < =  N < =  100,000 Output 输出…
http://www.lydsy.com/JudgeOnline/problem.php?id=2818 我很sb的丢了原来做的一题上去.. 其实这题可以更简单.. 设 $$f[i]=1+2 \times \phi (i) $$ 那么答案就是 $$\sum_{p是质数} f[n/p]$$ 就丢原来的题了...不写了.. #include <cstdio> #include <cstring> #include <cmath> #include <string>…
题目 传送门:QWQ 分析 仪仗队 呃,看到题后感觉很像上面的仪仗队. 仪仗队求的是$ gcd(a,b)=1 $ 本题求的是$ gcd(a,b)=m $ 其中m是质数 把 $ gcd(a,b)=1 $ 变形成 $ gcd(a,b)*m=m $ 然后在n的范围内枚举一下,使 $ gcd(a,b)*m <= n $ 再像仪仗队那样用欧拉函数搞一搞. 没了. 代码 #include <bits/stdc++.h> using namespace std; const int maxn=1e7+…
[Jsoi2015]最大公约数 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 302  Solved: 169[Submit][Status][Discuss] Description 给定一个长度为 N 的正整数序列Ai对于其任意一个连续的子序列{Al,Al+1...Ar},我们定义其权值W(L,R )为其长度与序列中所有元素的最大公约数的乘积,即W(L,R) = (R-L+1) ∗ gcd (Al..Ar). JYY 希望找出权值最大的子序列…
传送门 不知谁说过一句名句,我们要学会复杂度分析 #include <bits/stdc++.h> using namespace std; #define rep(i,a,b) for(int i=a;i<=b;++i) #define fd(i,a,b) for(int i=a;i>=b;--i) ; typedef long long ll; inline ll gi() { ll x=; char o; bool f=true; for(;!isdigit(o=getcha…
GCDDescription 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对. Input 一个整数N Output 如题 Sample Input 4 Sample Output 4HINT hint 对于样例(2,2),(2,4),(3,3),(4,2) 1<=N<=10^7 分析: 如果两个数字x,y,它们互质则 由gcd(x,y)=1 可知gcd(x*p[i],y*p[i])=p[i] 现在这个问题就变成了对于1~n的每个质数p[i],1~…
这个告诉gcd的操作实际上就是告诉一个因数是否选,最坏情况是1,判断掉所有因数才能选 然后肯定是用猜不重复质数积比较划算,问题就变成若干个质数,分成数量尽量小每组乘积<=n的若干组 从大质数开始,贪心的选尽量多的小质数和他乘起来,原理是反正大质数都要分进一组,能多带流多带 #include<iostream> #include<cstdio> using namespace std; const int N=10005; int n,p[N],tot,ans; bool v[…
[题目链接] 点击打开链接 [算法] 线性筛出不大于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…
枚举小于n的质数,然后再枚举小于n/这个质数的Φ的和,乘2再加1即可.乘2是因为xy互换是另一组解,加1是x==y==1时的一组解.至于求和我们只需处理前缀和就可以啦,注意Φ(1)的值不能包含在前缀和里,因为这样就会把x==y==1的情况算2次了,,,貌似包含后只要乘2再减1就可以了 #include<cstdio> using namespace std; const int N=10000003; int num=0,prime[N],phi[N]; long long sum[N]; b…