具体数学第二版第一章习题(2)

16、令$n=2^{m}+t,0leq t < 2^{m}$,即$n=({1b_{m-1}b_{m-2}...b_{2}b_{1}b_{0}})_{2}$.令$g(n)=A_{n}alpha +B_{n}gamma +C_{n}eta _{0}+D_{n}eta _{1}$

(1)设$alpha =1,eta _{0}=eta _{1}=gamma =0$,那么可以得到$g(1)=1,g(2n)=g(2n+1)=3g(n)$,所以$g(n)=3^{m}=A_{n}alpha +B_{n}gamma +C_{n}eta _{0}+D_{n}eta _{1}=A_{n}$

(2)令$g(n)=n$可以得到$g(1)=alpha = 1,2n=3n+gamma n + eta _{0},2n+1=3n+gamma (n+1) + eta _{1}$,所以$alpha = 1, gamma = -1, eta_{0}=0,eta_{1}=1$,可以得到$n=A_{n}-B_{n}+D_{n}$,所以$B_{n}-D_{n}=3^{m}-n$

(3)令$alpha =1,eta _{0}=1,eta _{1}=gamma =0$,即$g(1)=1, g(2n)=3g(n)+1,g(2n+1)=3g(n)$,可以得到$g(n)=3^{m}+sum_{i=0}^{m-1}3^{i}(1-b_{i})=A_{n}+C_{n}$,所以 $C_{n}=sum_{i=0}^{m-1}3^{i}(1-b_{i})$

(4)令$alpha =1,eta _{1}=1,eta _{0}=gamma =0$,即$g(1)=1, g(2n)=3g(n),g(2n+1)=3g(n)+1$,同理可以得到 $D_{n}=sum_{i=0}^{m-1}3^{i}b_{i}$

所以$g(n)=3^{m}alpha +left (3^{m}-n+sum_{i=0}^{m-1}3^{i}b_{i}  ight )gamma +left (sum_{i=0}^{m-1}3^{i}(1-b_{i})  ight )eta _{0}+left (sum_{i=0}^{m-1}3^{i}b_{i}  ight )eta _{1}$

17、对于$frac{n(n+1)}{2}=frac{n(n-1)}{2}+n$个盘子来说,假设四根柱子为ABCD,最后将所有盘子从A移动到D,那么分为五步:(1)将上面的$frac{n(n-1)}{2}$移动到B,需要$W_{frac{n(n-1)}{2}}$步;(2)将接下来的$n-1$个盘子移动到C,需要$T_{n-1}$;(3)将第$n$个盘子移动到D,需要一步;(4)将C上的$n-1$个盘子移动到D,需要$T_{n-1}$步;(5)将B上的$frac{n(n-1)}{2}$个盘子移动到D,需要$W_{frac{n(n-1)}{2}}$步。所以最优的策略不会比这个差,因此$W_{frac{n(n+1)}{2}}leq W_{frac{n(n-1)}{2}}+T_{n-1}+1+T_{n-1}+W_{frac{n(n-1)}{2}}=2W_{frac{n(n-1)}{2}}+T_{n}$

根据这个递推公式,依次展开每一项,可以得到$W_{frac{n(n+1)}{2}}leq 2^{n}(n-1)+1$,所以$f(n)= 2^{n}(n-1)+1$

18、设第$j$条线左边的为$x_{j1}$,右边的为$x_{j2}$,可以得到两条线为:$x_{j1}=-(n^{j}+n^{-n})y+n^{2j},x_{j2}=-n^{j}y+n^{2j}$。对于两个$i,j,i<j$来说,可以求出四个交点的$y$坐标分别为:$C_{ij22}=C_{ij11}=n^{i}+n^{j},C_{ij12}=frac{n^{2i}-n^{2j}}{n^{i}+n^{-n}-n^{j}},C_{ij21}=frac{n^{2j}-n^{2i}}{n^{j}+n^{-n}-n^{i}}$。可以很明显看出这四个交点都是大于0的,所以可以得到任意两个都有四个交点。还要证明一点就是任意三条线都不会相交于一点。对于$i<j<kleq n$来说,很明显$C_{ik22}=C_{ik11} eq C_{ij11}$,同时$C_{ik22} eq C_{ij12}$,因为前面是整数后面是小数.最后需要证明的是$C_{ij12} eq C_{ik12},C_{ij12} eq C_{ik21},C_{ij21} eq C_{ik12},C_{ij21} eq C_{ik21}$.这四个的证明比较类似,下面只证明$C_{ij12} eq C_{ik12}$.假设它们相等,那么有$frac{n^{2i}-n^{2j}}{n^{i}+n^{-n}-n^{j}}=frac{n^{2i}-n^{2k}}{n^{i}+n^{-n}-n^{k}}$.令$a=n^{2i},b=n^{i}+n^{-n}$.化简一下可以得到:$(n^{j}-n^{k})(a-b(n^{j}+n^{k})+n^{j+k})=0$.后面这个式子不会等于0,因为$a+n^{j+k}$是整数,而$b(n^{j}+n^{k})$是个小数.所以假设错误.

19,首先,所有的顶点都在$x$轴上.假设第一个的一条边在$y$轴,另一条边与$x$轴夹角120度,顶点在原点.那么后面每条边的顶点沿着$x$轴正半轴逐渐增大.那么可以推出第二个的左侧的边与$x$轴的夹角大于150度,第三个大于180度,第四个大于210度,第五个大于240度,如果有第六个,那么大于270度,这时候与第一个没有四个交点了.所以最多5个.

20、令$h(n)=A(n)alpha +B(n)gamma _{0}+C(n)gamma _{1}+D(n)eta _{0}+E(n)eta _{1}$,$n=(1b_{m-1}b_{m-2}...b_{2}b_{1}b_{0})_{2}$

(1)令$alpha=1,gamma _{0}=gamma _{1}=eta _{0}=eta _{1}=0$,可得到$A(n)=4^{m}$

(2)令$alpha=eta _{0}=1,gamma _{0}=gamma _{1}=eta _{1}=0$,可得到$D(n)=sum_{i=0}^{m-1}4^{i}(1-b_{i})$

(3)令$alpha=eta _{1}=1,gamma _{0}=gamma _{1}=eta _{0}=0$,可得到$E(n)=sum_{i=0}^{m-1}4^{i}b_{i}$

(4)令$alpha=gamma _{0}=1,eta _{1}=gamma _{1}=eta _{0}=0$,可得到$B(n)=sum_{i=0}^{m-1}4^{i}left lfloor frac{n}{2^{i}} ight floor(1-b_{i})$

(5)令$alpha=gamma _{1}=1,eta _{1}=gamma _{0}=eta _{0}=0$,可得到$C(n)=sum_{i=0}^{m-1}4^{i}left lfloor frac{n}{2^{i}} ight floor b_{i}$

21、如果删除的序列是确定的话,那么可以得到若干个模方程。假设$n=3$:

(1)删除的序列是4,5,6,那么有$m$%6=4, $m$%5=1, $m$%4=3,可以看出满足这样的$m$是不存在的,因为$m$%6=4要求$m$是偶数,而$m$%4=3要求$m$是奇数。
(2)删除的序列是5,4,6,那么有$m$%6=5, $m$%5=0, $m$%4=1,可以看出满足$m=5$可以满足要求,其实所有的$60k+5$都是满足的;

依次算下去有很多种,也就是有可能有很多种答案。但是一定有一个答案是$m=LCM(n+1,n+2,...,2n)$。因为可以从$2n$到$n+1$逆序删掉.这时候要求$m$是$n+1,n+2,..,2n$的最小公倍数。

22、这里有个叫做德布鲁因序列的东西。它的含义是可以构造一个有$k$种字符组成的长度为$k^{n}$的环形序列,使得任意连续的$n$个字符组成的子串两两不同。比如$k=2,n=4$,那么这个序列为0000111101100101.这$2^4$种子串恰好是长度为4的01串的所有情况。

对于这个题目,对于$n$来说,可以首先构造一个$2^{n}$的凸多边形,然后为每个边附一个值0或者1,附的值满足它们是一个德布鲁因序列。然后为每个1的边上粘贴一个非常细窄的三角形(这时候它就不是$2^{n}$条边了),且这些三角形各不相同(防止旋转之后完全重合),然后分别将这个多边形旋转$0,1,2,...,n-1$次得到$n$个多边形,那么这$n$个多边形此时就构造了一个$2^{n}$的韦恩图。

23、首先令$L(n)=Lcm(1,2,3,...,n-1,n)$,假设$n>2$($n$<=2是情况比较简单).另外有个贝特朗假设,它是说对于任意的整数$t$满足$[t,2t]$之间存在至少一个素数。所以在$[frac{n}{2},n]$之间一个存在一个素数$p$。下面分两种情况:

(1)$jgeq frac{n}{2}$.这时候可以取$q$满足如何关系:$qequiv 1(modleft (frac{L(n)}{p}  ight )),qequiv j+1-n(mod left (p  ight ))$。这时候将依次删掉$1,2,...,n-p,j+1,j+2,...n-1,n,n-p+1,n-p+2,...,j-2,j-1$.这分为三段,第一段是$1,2,...,n-p$,因为对于任意的$p<xleq n$来说,$qequiv 1(modleft ( x ight ))$,接下来第二段$j+1$.当$x=p$时出现一个跳变,因为$qequiv j+1-n(mod left (p  ight ))$,其实就是跳到第$j+1-n+p$,因为$j+1-n<0$。而删掉了前$n-p$个后,$j$是第$j-(n-p)$,所以现在恰好跳到$j$后面1个的位置上,即$j+1$。剩下的最后一段。因为对于任意的$2leq x<p$有$qequiv 1(modleft ( x ight ))$

(2)$j<frac{n}{2}$,这时候这时候令$j^{'}=n+1-j$时按照步骤(1)计算出$q$,那么此时的$q^{'}=L(n)+1-q$可以保证最后剩下$j$,因为删掉的序列依次是$n,n-1,...,p+1,j-1,j-2,...,2,1,p,p-1,...,j+2,j+1$

24、满足条件的一个序列为$X_{n}=2isinpi r+frac{1}{X_{n-1}}$,其中$0leq r<frac{1}{2}$。比如$r=frac{1}{3}$时周期为6,$r=frac{1}{4}$时周期为4,$r=frac{1}{5}$时周期为10.

$sin^{2}frac{pi }{n}=frac{1-cosfrac{2pi }{n} }{2}$

$cos^{2}frac{pi }{n}=frac{1+cosfrac{2pi }{n} }{2}$

随着$n$的增大,不停用上面两个公式展开其中的sin部分,最后到$cospi ,cos2pi $时会消掉角度的部分。当恰好满足虚部系数为0,实部为$X_{0}$时即得到一个循环。

25、假设$F_{k}$表示将$n$个盘子通过辅助的$k$个盘子从A柱子移动到B柱子的最少次数.比如$F_{1}(n)=T(n)=2^{n}-1,F_{2}(n)=W(n)$.对于$inom{n+1}{c}$个盘子来说,由于$inom{n+1}{c}=inom{n}{c}+inom{n}{c-1}$,可以分为三步:

(1)将上面的$inom{n}{c}$个盘子通过$k$个辅助柱子从A移动到$k$个柱子上的某一个,比如第$t$个;

(2)将A上剩下的$inom{n}{c-1}$个盘子通过$k-1$个辅助柱子从A移动到$C$;

(3)将第$t$个柱子上的$inom{n}{c}$个盘子通过包括A在内的$k$个辅助柱子移动到$C$.

所以$F_{k}left (inom{n+1}{c}  ight )=2F_{k}left (inom{n}{c}  ight )+F_{k-1}left (inom{n}{c-1}  ight )$

26、我的猜测是,对于大的$n$,非约瑟夫子集应很多。纯属猜测。不过对于$nequiv 0(modleft ( 3 ight )),n>9$时一定有大小为$n-4$的非约瑟夫子集,我写了一个程序进行了验证。比如$n=12$时,不可能使得下面的四元组中的人成为坏人:{1,3,5,7},{1,3,6,11},{1,4,6,8},{1,7,9,11},{2,4,6,12},{2,7,10,12},{3,4,9,10},{5,7,9,12},{6,8,10,12}.

#include <algorithm>
#include <iostream>
#include <vector>

int ExtendGcd(int a, int b, int *x, int *y) {
  if (b == 0) {
    *x = 1;
    *y = 0;
    return a;
  }
  int d = ExtendGcd(b, a % b, x, y);
  int t = *x;
  *x = *y;
  *y = t - a / b * *y;
  return d;
}

bool Modular(std::vector<int> a, std::vector<int> m) {
  const int k = static_cast<int>(a.size());

  for (int i = 1; i < k; ++i) {
    int x, y;
    int d = ExtendGcd(m[0], m[i], &x, &y);
    int c = a[i] - a[0];
    if (c % d) return false;
    int t = m[i] / d;
    x = (c / d * x % t + t) % t;
    a[0] = m[0] * x + a[0];
    m[0] = m[0] * m[i] / d;
  }
  return true;
}

bool IsBad(std::vector<int> bad, int n) {
  do {
    std::vector<int> d;
    std::vector<int> r;
    std::vector<int> remain(n + 1, 1);

    auto Next = [&](int k) {
      if (k > n) {
        k = 1;
      }
      while (remain[k] == 0) {
        if (++k > n) {
          k = 1;
        }
      }
      return k;
    };
    int current = 1;
    for (int i = 0; i < 4; ++i) {
      int cnt = 1;
      while (current != bad[i]) {
        ++cnt;
        current = Next(++current);
      }
      d.push_back(n - i);
      r.push_back(cnt % (n - i));
      remain[current] = 0;
      current = Next(++current);
    }
    if (Modular(r, d)) {
      return false;
    }
  } while (next_permutation(bad.begin(), bad.end()));
  return true;
}

int main() {
  int n;
  while (std::cin >> n) {
    if (n % 3 != 0 || n < 9) {
      std::cout << "Data error: n % 3 = 0 && n >= 9
";
      continue;
    }
    for (int i = 1; i <= n; ++i) {
      for (int j = i + 1; j <= n; ++j) {
        for (int k = j + 1; k <= n; ++k) {
          for (int t = k + 1; t <= n; ++t) {
            if (IsBad({i, j, k, t}, n)) {
              std::cout << "No way to let these four to be bad: " << i << " "
                        << j << " " << k << " " << t << '
';
            }
          }
        }
      }
    }
  }
  return 0;
}

  

原文地址:https://www.cnblogs.com/jianglangcaijin/p/9029213.html