HDU 1098 [Ignatius's puzzle] 数论
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1098
题目大意:f(x)=5x^13+13x^5+kax. 给出k,求a使得对任意x,满足f(x)是65的倍数
关键思想:f(x)要是65的倍数,需满足f(x)既是5的倍数又是13的倍数。
1.f(x)为5的倍数需满足
f(x) % 5 = 0
5x^13+13x^5+kax % 5 = 0
x(13x^4+ka) % 5 = 0 对任意x成立
13+ka % 5 = 0 //费马小定理
3 +ka % 5 = 0
ka % 5 = 2
2.f(x)为13的倍数需满足
同理得ka % 13=8
于是升序遍历a,若满足以上两个条件,则输出。a最多为64,因为%65有一个循环
代码如下:
#include <iostream> using namespace std; int main(){ int k; while(cin>>k){ int a; for(a=0;a<65;a++){//f(x)%65,故kax里的a不会大于65 if(k*a%5==2&&k*a%13==8){//f(x)要是5的倍数也要13的倍数,分析结合费马小定理。 cout<<a<<endl; break; } } if(a==65)cout<<"no"<<endl;//没找到 } return 0; }
边完善自己边认识自己