费马小定理 hdu 1098

来源:互联网 发布:扫描软件下载 编辑:程序博客网 时间:2024/05/21 14:57

地址:http://acm.hdu.edu.cn/showproblem.php?pid=1098

题意:给出k。求使得f(x)=5*x^13+13*x^5+k*a*x对任意x都为65的倍数的a的最小值。

mark:65=13*5。要使f(x)是65的倍数,只需要f(x)是5和13的倍数即可。先来分析13的。

若f(x)是13的倍数,

有5*x^13+13*x^5+k*a*x % 13 == 0,其中13*x^5项显然不用考虑。

则只需5*x^13 + k*a*x是13的倍数,即x*(5*x^12+k*a)是13的倍数。若x是13的倍数,不用考虑。

若x不是13的倍数,则x一定与13互素,因为EulerPhi(13) == 12,从而x^12 % 13 == 1。

所以可知5*x^12 % 13 == 5。

因为要让任意x满足条件,则括号内必为13的倍数,有k*a+5 % 13 == 0,则k*a % 13 == 8。

同理可得k*a % 5 == 2。

据此,若k为5或13的倍数,a一定无解,否则,一定有解。

根据k%5的结果,可能为1、2、3、4,a应分别取5n+2,5n+1,5n+4,5n+3。

枚举a的值,若符合13的条件,则为解。

# include <stdio.h>int tab5[5] = {0, 2, 1, 4, 3} ;int main (){    int a, k ;    while (~scanf ("%d", &k))    {        if (k % 5 == 0 || k % 13 == 0)            printf ("no\n") ;        else        {            for (a = tab5[k%5] ; ; a+= 5)                if (k*a % 13 == 8) break ;            printf ("%d\n", a) ;        }    }    return 0 ;}

from 3a's blog http://www.cnblogs.com/lzsz1212/archive/2012/01/06/2315304.html