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;
}

 

 

 

posted @ 2013-10-22 20:27  Geekers  阅读(477)  评论(0编辑  收藏  举报