zoukankan      html  css  js  c++  java
  • 数学几个有趣的题目

    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)

        所以问题得以解决

     

     

  • 相关阅读:
    github.com/dotnet/orleans
    C#开源
    Windows Server 2016正式版14393英文版ISO镜像下载:_X64FRE_ZH-CN.ISO
    Windows Server 2016
    功能更新到 Windows 10 企业版, 版本 1607
    Load Audio or Vedio files
    Socket.Available 属性
    CaptureManagerSDK
    Net.Sockets
    Solid Edge如何制作装配体的剖视图
  • 原文地址:https://www.cnblogs.com/yejinru/p/3254598.html
Copyright © 2011-2022 走看看