BZOJ 2876 [Noi2012]骑行川藏
在约束∑(K_i * S_i * (V_i-V_i')^2 <= Eu下,求∑S_i / V_i的最大值
拉格朗日乘数法。具体百度。。。
BZOJ 1053 [HAOI2007]反素数ant
求反素数
分析:
根据乘法原理,n的因子数为(p1+1)*(p2+1)*...
所以可以使用递归的形式找到不大于n的反素数,另外想要使得数目
最多,所以必须使得素数因子最小的数目最多(可增加一剪枝使得
搜索更快)。
sgu 126 Boxes
有两个箱子,分别有a,b个球,现在从一个箱子往另一个箱子移动球,每次移动只能够是另一个箱子球的个数,问能不能够使得其中一个箱子空。
分析:我们可以从(0,n)往前面推,发现gcd(a,b)跟(a,b)的状态是一样的。所以
我们可以先对(a,b)分别除掉他们的最大公约数,然后判断a+b是否是2^k形式即可
BZOJ 1257 [CQOI2007]余数之和sum
给出正整数n和k,计算j(n, k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n的值,其中k mod i表示k除以i的余数
分块计算。
k%n = k-k/n,所以sum = n*m-sigma(k/i *i)
k/i可以分成区间[ i,k/(k/i) ),在这个区间内的所有k/i值相等。所以可以划分为
一个区间的等差数列来做
HOJ 2446 Cellular Automaton
在一个环中有n个格子,每个格子的值为ai,距离该格子不足d的所有格子的和对于m取余为新的值,问第k次变换后的所有n个格子的值
很容易可以构造出一个循环的矩阵出来,但是如果是O(n^3*logn)会TLE。我们可以注意到循环矩阵a * b只需要计算a的第一行*b,然后下面的移位均可以得到。时间为O(n^2*logn)
poj 3318 Matrix Multiplication
判断矩阵a * b == c
方法一:
O(n^3)算法提示会TLE,但是原矩阵是一个稀疏矩阵,所以可
以在相乘的时候判断是否为0,这样同样不会TLE~~
方法二:
压缩矩阵,左乘1*n的矩阵,使得左边以及右边都变成1*n的
矩阵,然后两边判断是否相等就行了~~但是如果这样压缩的话,
不保证每个元素的特性,所以这个1*n的矩阵得要体现特性,构
造的时候可以取随机数,或者令(1,2...n)
sgu 196 Matrix Multiplication
给出无向图边的关系,转化为邻接矩阵A,求A* X A,A*表示转置矩阵
无向图转化为矩阵之后,A* = A
假设B[i,j] = sigma_k ( A[i,k]*A[k,j] )
ans = sigma_i ( sigma_j ( B[i,j] ) )
= sigma_i ( sigma_j ( sigma_k( A[i,k]*A[k,j] )))
= sigma_k ( sigma_i(A[i,k]) * sigma(B[k,j]))
BZOJ 1045 [HAOI2008] 糖果传递
有n个小朋友坐成一圈,每人有ai个糖果。每人只能给左右两人传递糖果。每人每次传递一个糖果代价为1,求使所有人获得均等糖果的最小代价。
* 分析:
* 假设a1分给an的糖果数为k,则可以得到以下的信息:
* a1 a2 a3 a4... an-1 an
* 当前数目:a1-k a2 a3 a4 an-1 an+k
* 所需代价:|a1-k-ave| |a1+a2-k-2*ave| |a1+a2+a3-k-3*ave| |a1+..+a(n-1)-k-(n-1)*ave| |k|
* 以sum[i]表示从a1加到ai减掉i*ave的和值,这以上可以化简为
* 总代价 = |s1-k|+|s2-k|+...+|s(n-1)-k|+|k|
* 不难看出:当k为s1...s(n-1)中的中位数的时候,所需的代价最小
积性函数
poj 1845 Sumdiv
求a^b所有约数的和
积性函数
预备知识:
1.对a进行素数约数分解
a = p1^k1 * p2^k2...pm^km
2.a^b的所有约数之和
sum = [ 1+p1+...+p1^k1 ]*...*[ 1+pm+pm^2+...+pm^km ]
3.等比数列求和
1+p+p^2+...+p^n
经典类型。递归二分然后快速幂取模
poj 3604 Professor Ben
求n的所有约数个数的立方和
g(n) = sigma( f(d) ),d|n
g(n)为积性函数,即g(n*m) = g(n)*g(m)
所以我们可以对n进行质因数分解
n = p1^k1 * ... * pm^km
然后g(n) = PI( f(p1^k1) )
容易得到
f(p^k)的约数有1,p,p^2....p^k,约数个数为k+1
即f(p^k) = 1+2+...+(1+k)
问题解决。。
poj 2480 Longge's problem 经典积性函数
求sigma( gcd(i,n) )
gcd(i,n) = gcd(i,a*b) = gcd(i,a)*gcd(i,b)
所以gcd是一个积性函数。
积性函数的和还是积性函数。
所以
f(n) = sigma( gcd(i,n) )也是积性函数
f(n) = f(p1^k1 * ... * pm^km) = f(p1^k1) * f(p2^k2) *...* f(pm^km)
又因为
f(n) = sigma( d* phi(n/d) ),i = d|n
所以可以化为
f(p^k) = sigma( p^i * phi( p^(k-i) ) )
而
phi(p^k) = p^k-p^(k-1)
所以问题得以解决