讲课手稿-6

文章来源: http://thunderfyc.wordpress.com.cn

递推
  f(x) = f(x-1)+f(x-2)
  M = ((0,1),(1,1))
  ((f(x)), (f(x+1))) * M = ((f(x+1)), (f(x+2)))
 
  ((f(x)), (f(x+1))) = ((f(1)), (f(2)))*M^(x-1)

  集合划分
    n个元素划分到k个集合里
    f(n,k) = f(n-1, k-1) + k*f(n-1, k)
    n-1个元素放在k-1个集合里 剩下一个单独成集合
    或者n-1个元素在k个集合里 剩下一个放置在其中任何一个

  错装信封
    第i封信不在第i个信封里
    假设i在n上 n在i上 剩下n-2个错排 所以有f(n-2)*(n-1)个 i枚举从1到n
    假设i不在n上 n在i上 那么去掉n后 n-1个位置对应n-1个数的错排(i考虑为n) 那么有f(n-1)*(n-1)个
    f(n) = (f(n-1)+f(n-2))*(n-1)

数论
  gcd(a, b) = gcd(b, a mod b)

  互素的数的个数
  Phi(n) = n(1-1/p1)(1-1/p2)…(1-1/pi)

  a^b mod n
    b的二进制表示<bk,bk-1,…,b0>
    从左到右 d = (d*d) mod n 如果bi=1 d = (d*a) mod n

高精度
排列组合
  求排列为第几位
    从第一个位置到最后一个 求比当前位置的数更小的数且不和前面相同的可能数 累加
    例如 13245 0*4! + 1*3! + 0*2! + 0*1! + 0 = 6  (12345 12354 12435 12453 12534 12543 13245)
         41352 3*4! + 0*3! + 1*2! + 1*1! = 75

  求某位排列
    从第一位开始确定 用x!的倍数来确定是在前面未出现的数中排列第几的数

  求后继
    找到一个一直延伸到末尾的递减序列 然后将前一个值和递减数列中恰大于它的值互换后 将递减序列排序为递增
解方程
  Newton迭代
    求导之后 作切线 得到和x轴交点作为新的x 求导 作切线 不断逼近

计算函数解析式
  Lagrange插值公式
    已知n个点坐标 求过这些点的方程
    f(x) = sigma(f(ai) Pi(x-aj[j<>i])/Pi(ai-aj[j<>i]))

不定方程
  Euclid
  gcd(a, b) = ax + by 有解
  (d’,x’,y’) = ext_gcd(b, a mod b)  (d,x,y) = (d’, y’, x’-[a/b]y’)

  Pythagoras
  a^2+b^2=c^2
  假设 x = a/c;  y = b/c;
     x^2+y^2=1
     y^2=(1-x)(1+x)=> y/(1+x) = (1-x)/y
  设 t = y/(1+x)
   tx-y=-t;  x+ty=1;
  另 t = u/v   [t为有理数]
   a/c = (v^2 - u^2)/(u^2+v^2)
   b/c = (2uv)/(u^2+v^2)
   u,v互素 且有一个奇数 v>u, a = v^2 - u^2; b = 2uv c = u^2 + v^2

  Pell
  x^2-ay^2 = 1
  xn = ((x1+d^0.5*y1)^n+(x1-d^0.5*y1)^n)/2
  yn = ((x1+d^0.5*y1)^n-(x1-d^0.5*y1)^n)/2d^0.5
  xn = x1xn-1 + dy1yn-1
  yn = y1xn-1 + x1yn-1

文章来源: http://thunderfyc.wordpress.com.cn

=================================================================================

猫的帽子里总有n个小猫,小猫又有小小猫,小猫的高度是猫的1/(n+1),
最小的猫高为1,已知最大的猫高度和最小的猫数,求除了最小猫的数量和所有猫的高度和

H0 = (N+1)^dep;
workNum = N^dep;
ln(H0) = dep*ln(N+1); ln(workNum) = dep*lnN;
ln(H0)/ln(workNum) = ln(N+1)/ln(N); [此方程y -> 1 精度会有问题]

ln(H0)/ln(H0/workNum) = ln(N+1)/ln((N+1)/N) = ln(N+1) / ln(1 + 1/N)
y = ln(N+1) / ln(1+ 1/N)  [增函数]
用Newton-Raphson 牛顿迭代法解(随便一个初始值,从函数上此点作切线,和x轴交点为新的值)
x = x0 - f(x0)/f’(x0) 迭代几次就可以了

notWorkNum = 1 + N + N^2 + … + N^(dep-1) = (N^dep - 1)/(N-1) = (workNum - 1)/(N-1);
HSum = 1 + (N+1)+(N+1)^2 + … + (N+1)^dep = ((N+1)^(dep+1) - 1)/N = (H0*(N+1) - 1)/N;

 

求数a b 满足1+2+..+a-1 = a+1+…+b

做方程a*(a-1) = (a+t+1+a+1)*(t+1)  x^2-2y^2 = 1
x = 2t+2a+3  y = 2a
用Pell方程求解
xn = x0*xn-1 + 2*y0*yn-1
yn = x0*yn-1 + y0*xn-1

=============================================================================

Bignum Plus(a,b:Bignum)
{
  for i <- 0 to maxn
  {
    c[i] = a[i]+b[i];
    c[i+1] += c[i] div 1000;
    c[i] = c[i] mod 1000;
  }
  return c;
}

Bignum Minus(a,b:Bignum)
{
  if (less(a,b))
    return Minus(b, a);
  for i <- 0 to maxn
  {
    if (b[i] < a[i])
    {
      b[i+1]-1;
      b[i]+1000;
    }
    c[i] = b[i]-a[i];
    c[i+1] += c[i] div 1000;
    c[i] = c[i] mod 1000;
  }
  return c;
}

Bignum Multi(a,b:Bignum)
{
  for i <- 0 to maxn
  {
    c = 0;
    for j <- 0 to maxn
    {
      c[i+j] = a[i]*b[j];
      c[i+j+1] += c[i+j]  div 1000;
      c[i+j] = c[i+j] mod 1000;
    }
    d = Plus(d, c);
  }
  return d;
}

文章来源: http://thunderfyc.wordpress.com.cn

Comments are closed.

© 2008 Vain.Thunder’s Blog[CN]
Magic Vision | Design: NET-TEC of ÖKO. Coding: Wasserbett of Hochzeitsplaner.