222333

题目链接

若p是质数,则对于任一整数a,或者p|a,或者(p,a)=1,整句说明一遍 然后再把这些符号说下,若p是质数,则对于任一整数a,或者p|a,或者(p,a)=1 整句说明一遍 然后再把这些符号说下, 若p是质数,则对于任一整数a,要么p能整除a(p是a的质因数或者说a是p的倍数),要么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;
            }
        }
    }
     
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值