题目链接: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;
}