随笔分类 - 数论
Coprime Sequence (HDU 6025)前缀和与后缀和的应用
摘要:题意:给出一串数列,这串数列的gcd为1,要求取出一个数使取出后的数列gcd最大。 题解:可以通过对数列进行预处理,求出从下标为1开始的数对于前面的数的gcd(数组从下标0开始),称为前缀gcd,再以类似的方式求出后缀gcd,然后从第一个数开始枚举取出后的gcd(这个数的前缀gcd与后缀gcd的gc
阅读全文
A New Function(LightOJ 1098)积性函数前缀和的应用
摘要:题意:要求对于1~n,每个数的约数(不包括1和其本身)的和。 题解:由于题目数据有2*10^9之大,因而不能直接暴力。需要考虑积性函数的特性,由于必定有重复的约数出现,因而可以对重复约数所在的区间进行合并。由于对于较小的约数,其对应的较大的约数重复区间较小,所以可以先将较小的约数进行合并操作,然后对
阅读全文
GCD XOR(UVa 12716)
摘要:题意:输入整数n(1<=n<=30000000),有多少对整数(a,b)满足1<=b<=a<=n,且gcd(a,b)=a xor b。 题解:设c=gcd(a,b),因为a-b<=a xor b,且a-b>=c,假设存在c是的a-b>c,则c<a-b<=a xor b,与c= a xor b矛盾。所
阅读全文
唯一分解定理(以Minimun Sum LCM UVa 10791为例)
摘要:唯一分解定理是指任何正整数都可以分解为一些素数的幂之积,即任意正整数n=a1^p1*a2^p2*...*ai^pi;其中ai为任意素数,pi为任意整数。 题意是输入整数n,求至少2个整数,使得它们的最小公倍数为n,且这些整数的和最小,输出最小的和。由唯一分解定理可看出当每个ai^pi作为一个单独的整
阅读全文
Prime Test(POJ 1811)
摘要:素数判定的模板题,运用米勒-罗宾素数判定,然后用Pollard_Rho法求出质因数。使用相应的模板即可,不过注意存储质因子的数组需要使用vector,并且使用long long类型存储,不然存储不下,而且输出最下的质因子时,需要写个迭代器进行查询。 完整代码如下: 其中米勒-罗宾判断法模板如下: P
阅读全文
Plant(𝐶𝑜𝑑𝑒𝐹𝑜𝑟𝑐𝑒𝑠 − 185𝐴)
摘要:#include #include using namespace std; const int maxn=2,mod=1000000007; struct Matrix { long long mat[maxn][maxn]; Matrix operator*(const Matrix& m)const///重载*运算符,使其能进行矩阵相乘的运算 ...
阅读全文
质因子分解(Pollard_Rho法)
摘要:LL Pollard_Rho(LL n, LL c) { LL x, y, d; LL i = 1, k = 2; x = y = rand() % n; do { i++; d = gcd(n + y - x, n); if(d > 1 && d = n) t = Pollard_Rho(n, ra...
阅读全文
米勒-拉宾素性测试
摘要:#include using namespace std; /** //普通快速幂 LL pow_mod(LL a, LL x, LL p) { LL res = 1; while(x) { if (x & 1) res = (unsigned long long)res * a % p; x >>= 1; a = (unsign...
阅读全文
简单矩阵快速幂(HDU Tr A 1575)
摘要:题目中所给的方阵就是一个矩阵,而就是只要将题目所给矩阵不断进行相乘即可,本题中我采用的是直接重载运算符*,使矩阵每一个都进行运算,可以简化为只对对角线上的元素进行运算。最后所得结果就只需将最终的矩阵上的对角线上的数相加即可。快速幂即是将指数进行质因子分解,从而减少运算,比如15=7*2+1,而7=3
阅读全文
矩阵快速幂(以HDU1757为例)
摘要:对于数据量大的求余运算,在有递推式的情况下,可以构造矩阵求解。 A - A Simple Math Problem A - A Simple Math Problem Lele now is thinking about a simple function f(x). If x < 10 f(x)
阅读全文
欧拉函数
摘要:1.互质:指2个整数的最大公约数只有1,这2个整数互质 2.欧拉函数的值即是小于x的整数中与x互质的数的数量,通式为φ(x)=x*(1-1/p1)*(1-1/p2)*.....*(1-1/pn)其中pi表示x的质因数,不能为1,可以为其本身。
阅读全文
小孩报数问题(约瑟夫环公式解决)
摘要:#include #include using namespace std; const int maxn=65; char name[maxn][maxn]; bool out[maxn]; int main() { int n; while(~scanf("%d",&n)) { memset(name,0,sizeof(name)); ...
阅读全文
浙公网安备 33010602011771号