HDU5478 Can you find it 快速幂取模

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5478


题目大意:找出满足模等式a^(k1*n+b1)+b^(k2*n-k2+1)=0(mod C)的所有(a,b),并按升序输出。其中C为素数且小于2*10^5,a,b<C,n为正整数。


分析:因为对任意的正整数n都成立,n=1时有:a^(k1+b1)+b=0(mod C),我们令等式两边同时乘上a^k1,得到:a^(k1*2+b1)+a^k1*b=0(mod C);n=2时我们有:a^(k1*2+b1)+b^(k2+1)=0(mod C),对比这两个等式我们会发现,a^k1==b^k2。那么接下来就好办了,我们只需枚举每一个a,然后b=C-a^(k1+b1),如果a^k1==b^k2,那么(a,b)就为满足原模等式的ab对。


实现代码如下:

#include <cstdio>
using namespace std;
typedef long long ll;
ll quick_mod(ll a,ll b,ll m)
{
    ll ans=1;
    a%=m;
    while(b)
    {
        if(b&1) ans=ans*a%m;
        b>>=1;
        a=a*a%m;
    }
    return ans;
}
int main()
{
    int C,k1,k2,b1,T=1;
    int b;
    while(scanf("%d%d%d%d",&C,&k1,&b1,&k2)!=-1)
    {
        bool flag=false;
        printf("Case #%d:\n",T++);
        for(int i=1;i<C;i++)
        {
            b=C-quick_mod(i,k1+b1,C);
            if(quick_mod(i,k1,C)==quick_mod(b,k2,C))
            {
                flag=true;
                printf("%d %d\n",i,b);
            }
        }
        if(!flag) puts("-1");
    }
    return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值