数学几个有趣的题目

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

给出正整数nk,计算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 AA*表示转置矩阵

无向图转化为矩阵之后,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|

 * 不难看出:当ks1...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)

    所以问题得以解决

 

 

posted @ 2013-08-13 10:29  yejinru  阅读(591)  评论(0编辑  收藏  举报