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