题目大意:f(x)=5*x^13+13*x^5+k*a*x,输入一个无负整数 k(k<10000),要找到最小的非负整数 a,将任意整数 x ,65|f(x),如果不存在该 a,则打印 “no”。
思路:这题有两种解法。第一种数学归纳法,第二种用费马小定理。
第一种:数学归纳法
1.当 x = 0 时,f ( 0 ) = 0 ,能被65整除。
2.当 x = x 时,f(x)=5*x^13+13*x^5+k*a*x能被65整除,那么 f ( x + 1 ) 肯定也是能被65整除的
3.当 x = x + 1 时,
f(x + 1 )= 5*(x+1)^13+13*(x+1)^5+k*a*(x + 1)
f(x + 1 )=5*()+
13*()+k*a*(x + 1)
f(x + 1 )=f(x)+5*()+
13*()+k*a
f(x + 1 )=f(x)+5*()+13*()+ka+18
由(2)可知,f ( x ) 能被65整除,
5*()+13*() 也能被65整除,
所以只要当 k * a + 18 能被65整除就存在 a,否则不存在 a。
代码如下:
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define endl '\n'
signed main(){int n;while(cin >> n){n%=65;int f=1;for(int i=0;i<=64;i++){if((18+n*i)%65==0){cout << i << endl;f=0;break;}}if(f) cout << "no" << endl;}return 0;
}
第二种:费马小定理(%p=1)
要 f ( x ) %65==0 , 即f ( x ) %13==0 && f ( x ) %5==0,所以可以分成两部分计算。
1.f(x)=5*x^13+13*x^5+k*a*x
f(x)=x*(5*x^12+13*x^4+k*a)%13=0 , 即 (5*x^12+13*x^4+k*a)%13=0
因为13*x^4 %13=0 (5*x^12+k*a)%13=0
由费马小定理可得,x^12%13=1 (k *a+5)%13=0
2.f(x)=5*x^13+13*x^5+k*a*x
f(x)=x*(5*x^12+13*x^4+k*a)%5=0 , 即 (5*x^12+13*x^4+k*a)%5=0
因为 5*x^12%5=0 (13*x^4+k*a)%5=0
由费马小定理可得,x^4%5=1 (k *a+13)%5=0
综上所述,当 (k *a+5)%13=0 && (k *a+13)%5=0 时 存在 a ,否则不存在 a。
代码如下:
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define endl '\n'
signed main(){int n;while(cin >> n){int f=1;n%=65;for(int i=0;i<=64;i++){if(n*i%5==2 && n*i%13==8){cout << i << endl;f=0;break;}}if(f) cout << "no" << endl;}return 0;
}