[恢]hdu 1098
2011-12-20 17:20:41
地址: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 ;
}