HDOJ 1098 Ignatius's puzzle (数论)
//http://acm.hdu.edu.cn/showproblem.php?pid=1098 /* 题目说x任意,于是取x=1, 公式变为f(x)=5+13+k*a 然后从小到大枚举a,满足f(x)%65==0即输出, 枚举a为1到64,因为a>=65时可简化为 65+i,65可以约去 有一个函数: f(x)=5*x^13+13*x^5+k*a*x 给定一个非负的 k 值 求最小的非负的 a 值 使得对任意的整数x都能使 f(x) 被 65 整除。 每输入一个k 值 , 对应输出一个 a值 , 若不存在a值 则输出 no 数学归纳法证明: 1.假设当x=n时,f(n)=........%65==0成立 则只需要证明f(n+1)=5(n+1)^13+13(x+1)^5+k*a*(x+1)%65==0成立即可 将f(x+1)用二项式分解,会发现5(n+1)^13+13(x+1)^5一定能被%65==0. 用f(x+1)-f(x),会发现,只有18+ka不能确定是否能%65==0;又因(18+ka)%65=(18%65+(k%65)*(a%65))%65,由此可以确定0<a<=65;即将65做为一个周期。 */
//代码1 #include<iostream> using namespace std; int main() { int n,i; while(scanf("%d",&n)!=EOF) { int a = 0; for(i=1;i<65;i++) { if((18+n*i)%65 == 0) { a = i; break; } } if(a) printf("%d\n",a); else printf("no\n"); } return 0; }
#include <iostream> #include <cmath> using namespace std; int exgcd( int a, int b ,int &x, int &y) { if( b == 0) { x = 1; y = 0; return a; } int d = exgcd( b, a % b, x , y); int temp = x; x = y; y = temp - (a / b) * y; return d; } int main() { int k; while(scanf("%d",&k)==1) { int a,b,d,t; d=exgcd(65,k,b,a); a=a/d*18;b=65/d; if (18%d) printf("no\n"); else printf("%d\n",abs((a%b+b)%b-b)); } return 0; }