Ignatius's puzzle
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 6462 Accepted Submission(s): 4481
Total Submission(s): 6462 Accepted Submission(s): 4481
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".
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
Author
eddy
Recommend
解题注意
这道题属于一道简单的数论题,涉及到扩展欧几里德算法。这道题中的一个关键点是保证函数f(x)=5*x^13+13*x^5+k*a*x这个函数对于任意整数的函数值都能够被65整除。这就让我想到了数学归纳法,以前在高中学数学归纳法时做过类似的证明题,证明一个式子对于任意正整数(正整数可以推广到整数范围)都可以被某个数整除。假设当f(x)成立,即5x^13+13x^5+k*ax=65*m1。则f(x+1)成立,即5(x+1)^13+13(x+1)^5+k*a(x+1)=65*m2。然后用二项式定理展开可得,5x^13+13x^5+k*ax+5(C(13,1)x^12+C(13,2)x^11+……C(13,12)x+1)+13(C(5,1)x^4+……C(5,4)x+1)+ka=
65m1+5(C(13,1)x^12+C(13,2)x^11+……C(13,12)x)+13(C(5,1)x^4+……C(5,4)x)+18+ka.由于f(x+1)要能够被65整除,所以18+ka=65m.即要保证65m-ka=18成立。化成扩展欧几里德算法中的形式为65x+(-k)y=18。所以当gcd(65,-k)是18的约数时,则有解,否则无解。当有解时,要保证解的值为正整数,而且最小。
参考代码
#include<cstdio>
int gcd(int a,int b)
{
return (b==0)?a:gcd(b,a%b);
}
void exgcd(int a,int b,int &d,int &x,int &y)
{
if(!b) {d=a,x=1,y=0;}
else{exgcd(b,a%b,d,y,x);y-=x*(a/b);}
}
int main()
{
int k;
while(~scanf("%d",&k))
{
int shu=0,x=0,y=0;
if(18%gcd(65,-k)!=0)
printf("no\n");
else
{
exgcd(65,-k,shu,x,y);
x=x*18/shu,y=y*18/shu;
if(y<0)
{
while(y<0)
y-=65/shu;
}
else
{
while(y>=0)
y-=65/shu;
y+=65/shu;
}
printf("%d\n",y);
}
}
}