HDU 1098 Ignatius's puzzle(数学归纳法)

Ignatius's puzzle

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 7551 Accepted Submission(s): 5246


Problem Description
Ignatius is poor at math,he falls across a puzzle problem,so he has no choice but to appeal to Eddy. this problem describes that:f(x)=5*x^13+13*x^5+k*a*x,input a nonegative integer k(k<10000),to find the minimal nonegative integer a,make the arbitrary integer x ,65|f(x)if
no exists that a,then print "no".


Input
The input contains several test cases. Each test case consists of a nonegative integer k, More details in the Sample Input.

Output
The output contains a string "no",if you can't find a,or you should output a line contains the a.More details in the Sample Output.

Sample Input
   
   
   
   
11 100 9999

Sample Output
   
   
   
   
22 no 43
//转载!

key:f(x)=5*x^13+13*x^5+k*a*x;由于x取任何值都需要能被65整除.假设f(x)成立的基础上,证明f(x+1)也成立.那么把f(x+1)展开(使用二项式),得到5*(  ( 13  0 )x^13 +  (13  1 ) x^12 ...... .....+(13  13)x^0)+13*(  ( 5  0 )x^5+(5  1 )x^4.....+ ( 5 5  )x^0 )+k*a*x+k*a;—这里的( n  m)表示组合数,然后提取出5*x^13+13*x^5+k*a*x则f(x+1 ) = f (x) +  5*( (13  1 ) x^12 ....+(13  13) x^0  )+  13*(  (5  1 )x^4+.......+ ( 5  5  )x^0 )+k*a;很容易证明,除了5*(13  13) x^0 、13*( 5  5  )x^0 和k*a三项以外,其余各项都能被65整除.那么也只要求出18+k*a能被65整除就可以了.而f(1)也正好等于18+k*a则只要找到a,使得18+k*a能被65整除,也就解决了这个题目;第一点:当a%65=0时,18+k*a是永远除不尽65的,第二点;a%65!=0 时,那么我们就从1开始找a,不断地尝试18+k*a是否能除尽65,找到即止。当a==66时,也就是已经找了一个周期了,在找下去也找不到适当的a了。

代码:

#include<iostream> using namespace std; int k; int main() {    while(cin>>k)    {                 if(k%65==0)                 {                                 cout<<"no"<<endl;                                 continue;                 }                  for(int i=1;;i++)                 {                                int temp=18+k*i;                                if(i>=66)                                {                                         cout<<"no"<<endl;                                         break;                                   }                                if(temp%65==0)                                {                                         cout<<i<<endl;                                         break;                                }                 }    }    return 0; }

你可能感兴趣的:(HDU 1098 Ignatius's puzzle(数学归纳法))