HDU5478 Can you find it 快速幂取模

来源:互联网 发布:python asyncio.wait 编辑:程序博客网 时间:2024/05/01 16:49

题目链接: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
原创粉丝点击