hdu 1098 Ignatius's puzzle(二项式定理)

思路:对f(x) 要使得任意x都满足65|f(x),即都能被65整除。那么用归纳法,若f(x)能被65整除,只要求得f(x+1)也能被65整除即可。

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

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

此时二项式展开f(x+1),得

f(x+1) = 5*( C(13,0)*x^13 + C(13,1)*x^12 +...+C(13,13)*x^0 ) + 13* (C(5,0)*x^5 + C(5,1)*x^4+...+C(5,5)*x^0) + k* a * x + k* a

提出f(x) = 5*x^13 + 13*x^5 + k* a* x,得到

f(x+1) = f(x) + 5*( C(13,1)*x^12 +...+C(13,13)*x^0 ) + 13* (C(5,1)*x^4+...+C(5,5)*x^0) +  k* a

根据二项式定理,我们知道二项式的系数肯定是整数,而13,5是质数,所以它们只要不与自己相除就肯定不会被约掉,那么就可以与外面的5,和13分别相乘等于65,因此

f(x+1) = f(x) + 5*( C(13,1)*x^12 +...+C(13,12)*x)+5*C(13,13)*x^0 ) + 13* (C(5,1)*x^4+...+C(5,4)*x)+13*C(5,5)*x^0) +  k* a

其中f(x) ,5*( C(13,1)*x^12 +...+C(13,12)*x) ,13* (C(5,1)*x^4+...+C(5,4)*x)这三项肯定是可以被65整除的。

因此f(x+1)能不能被65整除就看,剩下的那3项了,即5*C(13,13)*x^0 ),13*C(5,5)*x^0) , k* a

其值=18+k*a

因此只要判断18+k*a是否能被65整除即可。

当k能整除65时,18+k*a肯定就不能整除65了。因此k*a是65的倍数,加个18就肯定不能了。

当k不能整除65时,就将a从从1开始一直到65的带进去算,若有一个能整除就输出,若都不能就不能。因为66就又相当于循环了,即1-65是一个循环节


代码:

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <map>
#include <set>
#include <vector>
#include <algorithm>

using namespace std;

#define mst(a,b) memset(a,b,sizeof(a))
#define eps 10e-8

const int MAX_ = 10010;


int main(){
	int n, i;
	while(~scanf("%d",&n)){
        if(n%65==0){
            printf("no\n");
        }else {
            for(i = 1; i < 66; ++i){
            	if((18+n*i)%65==0){
                    printf("%d\n",i);break;
            	}
            }
            if(i == 66)printf("no\n");
        }
	}
	return 0;
}


你可能感兴趣的:(hdu 1098 Ignatius's puzzle(二项式定理))