若p是质数,则对于任一整数a,或者p|a,或者(p,a)=1,整句说明一遍 然后再把这些符号说下,
若p是质数,则对于任一整数a,要么p能整除a(p是a的质因数或者说a是p的倍数),要么p和a互质(最大公约数是1)
首先幂次方的值会越来越大很容易溢出,所以在这里使用数组进行存值,遍历的话也有很多方法,有暴力枚举的,这里巧妙的使用的搜索的办法,因为要求满足上述条件的数对(m,n)中m+n最小的一个,所以从左到右进行搜索
#include <iostream>
typedef long long LL;
LL P;
LL pow2[100007],pow3[100007];
int find(int s) {
long long ans = 1;
for(int x = 1;x < s;++x) {
ans = (pow2[x] * pow3[s-x] % P + P-1)%P;
if(ans == 0) return x;
}
return -1;
}
int main() {
while(std::cin >> P) {
pow2[0] = pow3[0] = 1;
for(int i = 1;i < 100000;++i){
pow2[i] = pow2[i-1]*2 % P;
pow3[i] = pow3[i-1]*3 % P;
}
for(int i = 2;i <= P;++i) {
int x = find(i);
if(x != -1){
std::cout << x << " " << i-x << std::endl;
break;
}
}
}
}