思路:对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; }