zoukankan      html  css  js  c++  java
  • Ignatius's puzzle

    问题陈述:

      HDOJ Problem - 1098

    问题解析:

      数学归纳法

      f(1) = 18 + ka;

      假设f(x) = 5*x^13+13*x^5+k*a*x 能被65整除 

      f(x+1) = 5*(x+1)^13+13*(x+1)^5+k*a*(x+1)

      根据二项式定理展开 (a+b)^n = C(n,0)*a^n*b^0 + C(n,1)*a^(n-1)*b^1 + C(n,2)*a^(n-2)*b^2 + ... + C(n,n)*a^0*b^n

      f(x+1) = 5 * (x^13 + C(13,1)*x^12 + C(13,2)*x^11 + ... + C(13,13)) + 13 * (x^5 + C(5,1)*x^4 + .. + C(5,5)) + k*x*a + ka;

      补充:组合数性质 C(n, m) (m < n) 如果n为质数 则C(n, m)能被n整除。 

      证明:

        C(n, m) = n! / (m! * (n-m)!) = (n-m+1) * (n-m+2) * ... * n / m!

        m = 1: C(n, m) = n; C(n, m) % n = 0;

        1 < m < n: 因为C(n, m)为整数,n为质数,m!为合数,n / m! 不是整数,进而(n-m+1) * (n-m+2) * ... * (n-1) / m!必为整数,所以C(n, m)能被n整除。

      证毕。

      化简 : f(x+1) = 5*x^13 + 5*13*g(x) + 5 + 13*x^5 + 13*5*h(x) + 13 + k*x*a + ka;

            = f(x) + 65*g(x) + 65*h(x) + 18 + ka;

      只要证明 18 + ka 能被65整除。

      又因为(a + b) mod m = (a mod m + b mod n) mod m

      所以只要证明 ka 能被 47 整除。

    代码详解:

     1 #include <iostream>
     2 
     3 using namespace std;
     4 
     5 int main()
     6 {
     7     int k, a;
     8     while(cin >> k) {
     9         if(k % 65 == 0) {
    10             cout << "no" << endl;
    11             continue;
    12         }
    13         for(a=0; a<65; a++) {
    14             if(k*a % 65 == 47) {
    15                 cout << a << endl;
    16                 break;
    17             }
    18         }
    19         if(a == 65) {
    20             cout << "no" <<endl;
    21         }
    22     }
    23     return 0;
    24 }

    转载请注明出处:http://www.cnblogs.com/michaelwong/p/4348291.html

  • 相关阅读:
    扫雷游戏
    打地鼠Demo
    Game2048
    蛇形矩阵
    约瑟夫环
    二分法查找
    动态规划之防卫导弹
    动态规划之0-1背包问题
    回溯算法之火力网
    回溯算法之8皇后问题
  • 原文地址:https://www.cnblogs.com/michaelwong/p/4348291.html
Copyright © 2011-2022 走看看