随笔分类 -  最大公约数

摘要:题意很简单,就是给你一个数组大小为n的值从1到n,之后有m次操作,要么修改前面的数组中的某一项,要么是输出从x到y(包括边界)中的数与p互质的数的和。由于m很小(m<=1000)故,将修改的部分保存下来之后统计输出时,在判断修改的部分是否与p互质,若是要修改原来的,在修改现在的。注意,就是多次修改同一个地方,只记录最后一次。对于统计从x到y的与p互质数的和,有结果=数1到y的满足要求的结果-数1到x-1的满足要求的结果。而从1开始到n的数中与p互质的数的和的求法,就是个容斥原理的算法。剔除p中单个素因子的倍数,加上两个因子的倍数,接着在剔除三个素因子的倍数,直到所有的素因子结束。。/** 阅读全文
posted @ 2012-09-23 00:56 qingyezhu 阅读(344) 评论(2) 推荐(0)
摘要:#include<stdio.h>#include<math.h>#define LL long longLL a, b, x, y;LL gcd(LL p, LL q) { LL r = 1; while (r) { r = p % q; if (r) { p = q; q = r; } } return q;}LL solve() { LL i, te; b /= a; te = (LL) (sqrt(b * 1.0)); for (i = te; i >=... 阅读全文
posted @ 2011-10-11 19:13 qingyezhu 阅读(346) 评论(0) 推荐(0)
摘要:做法:直接求过不了只能考虑 对于gcd(M,N)=i 有Ci个M满足此式 答案便是∑(Ci*i)gcd(M,N)=i <=> gcd(M/i,N/i)=1 而求gcd(M/i,N/i)=1 有多少个M/i满足 这便是欧拉函数Phi()的定义所以就转化为了求Phi(N/i)枚举每个 M|N 求出Phi(N/i) 答案便是 ∑(Phi(N/i)*i)那么如何枚举每个 M|N 呢?很简单 枚举1到sqrt(N)的所有整数,所有的约数便是 j|N (N/j)|N这样就搞定了#include<stdio.h>#include<math.h>#include<st 阅读全文
posted @ 2011-07-28 14:15 qingyezhu 阅读(253) 评论(0) 推荐(0)