A/B(拓展欧几里得求逆元或暴力枚举)
题面
题目分析
常规解法为拓展欧几里得求出B的逆元x,将n/B(mod 9973)转化为n*x(mod 9973)。特殊揭发:因为9973较小,所以可以枚举出0~9972所有的数找出结果。
代码
常规解法:
#include<stdio.h>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<stack>
#define mod 998244353
using namespace std;
int exgcd(int a,int b,int &x,int &y)//拓展欧几里得
{
if(b==0)
{
x=1;
y=0;
return a;
}
int ans=exgcd(b,a%b,x,y);
int tmp=x;
x=y;
y=tmp-a/b*y;
return ans;
}
int cal(int a,int m)//求逆元
{
int x,y;
int gcd=exgcd(a,m,x,y);
if(1%gcd!=0)return -1;
x*=1/gcd;
m=abs(m);
int ans=x%m;
if(ans<=0)ans+=m;
return ans;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n,B;
scanf("%d%d",&n,&B);
int x=cal(B,9973);
printf("%d\n",(n*x)%9973);
}
return 0;
}
特殊解法:
#include<cstdio>
using namespace std;
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
long long n,B;
scanf("%lld%lld",&n,&B);
for(int x=0;x<9973;x++)
{
if( (B*x)%9973==n )
{
printf("%d\n",x);
break;
}
}
}
}