您的位置:首页 > 其它

数论及应用学习__Part1 拓展欧几里得【3/5】

2017-07-22 10:39 204 查看
题目连接:

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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  拓展欧几里得