题意:给出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的条件,则为解。
费马小定理:
费马小定理是数论中的一个重要定理,其内容为: 假如p是质数,且(a,p)=1,那么 a^(p-1) ≡1(mod p) 假如p是质数,且a,p互质,那么 a的(p-1)次方除以p的余数恒等于1 。
欧拉函数EulerPhi(m):当m>1是,EulerPhi(m)表示比m小且与m互质的正整数个数
如:EulerPhi(24)=8 (1,5,7,11,13,17,19,23)
<span style="color:#000000;">#include <iostream>
#include <cstdio>
using namespace std;
int tab[5]={0,2,1,4,3};<span style="font-family:微软雅黑;">//为了确保k*a%5==2</span>
int main()
{
int k;
while(~scanf("%d",&k))
{
if(k%5==0||k%13==0){
printf("no\n");
continue;
}
for(int a=tab[k%5];;a+=5){
if(k*a%13==8){
printf("%d\n",a);
break;
}
}
}
return 0;
}</span>