题目链接:哆啦A梦传送门
题意:对于f(x)=5*x^13+13*x^5+k*a*x,给定k,求最小的正整数a满足65|f(x)。
题解:参考博客:https://blog.csdn.net/ACdreamers/article/details/8572959
解法一:
f(x)=x*(5*x^12+13*x^4+k*a)。
假设1:x为65的倍数,显然此时f(x)满足条件。
假设2:x为13的倍数,要使f(x)满足条件,5*x^12+13*x^4+k*a为5的倍数,即 13*x^4+k*a 为5的倍数,因为 gcd(5,13)=1,由费马小定理可得 ,所以 ,故 k*a 必须模5余2 ()。
假设3:x为5的倍数,同理得 k*a 必须模13余8 ()。
假设4:x既不是5的倍数,也不是13的倍数,要使f(x)满足条件,5*x^12+13*x^4+k*a就要为65的倍数。即要使得
&&
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
int k;
while(~scanf("%d",&k))
{
bool flag=true;
for(int i=1;i<=65;i++)
{
if((i*k)%13==8&&(i*k)%5==2){
printf("%d\n",i);
flag=false;
break;
}
}
if(flag) puts("no");
}
return 0;
}
解法二:
因为任意一个x值都要满足 65|f(x),故我们就直接令x=1,
得 18+k*a为65的倍数,即 18+k*a=65*b,由不定方程 a*x+b*y=c有解的充要条件为 c%gcd(a,b)==0。
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
int gcd(int a,int b)
{
if(!b) return a;
else return gcd(b,a%b);
}
int main()
{
int k;
while(~scanf("%d",&k))
{
if(18%gcd(k,65)) {
puts("no");continue;
}
for(int a=1;a<=65;a++)
{
if((18+k*a)%65==0){
printf("%d\n",a);
}
}
}
return 0;
}