HDU 1098解题报告

来源:互联网 发布:凯聪智云软件下载 编辑:程序博客网 时间:2024/05/01 17:31

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



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
111009999
 
Sample Output
22no43
 
Author
eddy

Recommend
We have carefully selected several similar problems for you:  1071 1014 1052 1049 1082

解题注意

       
       这道题属于一道简单的数论题,涉及到扩展欧几里德算法。这道题中的一个关键点是保证函数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*m
2。然后用二项式定理展开可得,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=
65m
1+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);        }    }}


0 0
原创粉丝点击