题目连接:
NEFU 84:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=84
https://cn.vjudge.net/contest/172643#overview
Nefu 84:我是萌萌哒题解
A.求(A/B)%9973
我们求出B的逆元InB;
那么答案就是A*InB%mod
现在给出A%mod的值为n,那么答案就是InB*n%mod;
Ac代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define ll long long int
ll x,y;
ll ex_gcd(ll a,ll b,ll &x,ll &y)
{
if(b==0)
{
x=1;
y=0;
return a;
}
ll ans=ex_gcd(b,a%b,x,y);
ll tmp=x;
x=y;
y=tmp-a/b*y;
return ans;
}
ll mod_inverse(ll a,ll m)
{
ex_gcd(a,m,x,y);
return (x%m+m)%m;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
ll n,B;
scanf("%lld%lld",&n,&B);
ll InB=mod_inverse(B,9973);
ll ans=n*InB%9973;
printf("%lld\n",ans%9973);
}
}
B.
C.要求ax+by=1的解x,y。要求x>0
如果要有:ax+by=d有解,那么需要保证ax+by=gcd(a,b)中,gcd(a,b)为d的因子。
这里d==1.那么需要保证gcd(a,b)也是1.
特殊要求x>0.我们已知通解:
X=x+b/d*t
Y=y-a/d*t
这里t为任意常数。
那么暴力枚举t即可。
Ac代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define ll long long int
ll x,y;
ll ex_gcd(ll a,ll b,ll &x,ll &y)
{
if(b==0)
{
x=1;
y=0;
return a;
}
ll ans=ex_gcd(b,a%b,x,y);
ll tmp=x;
x=y;
y=tmp-a/b*y;
return ans;
}
int main()
{
ll a,b;
while(~scanf("%lld%lld",&a,&b))
{
ll gc=ex_gcd(a,b,x,y);
if(1%gc==0)
{
while(x<=0)
{
x+=b/1;
y-=a/1;
}
printf("%lld %lld\n",x,y);
}
else
{
printf("sorry\n");
}
}
}
D.

本文针对NEFU84编程竞赛中的A、B两题进行了解析,包括求(A/B)%9973的具体算法实现及求解ax+by=1且x>0的整数解的方法。通过扩展欧几里得算法找到逆元和最大公约数,提供了AC代码。

977

被折叠的 条评论
为什么被折叠?



