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

来源:互联网 发布:停止mysql服务命令 编辑:程序博客网 时间:2024/06/02 02:45

题目连接:

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 intll 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 intll 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.





阅读全文
0 0
原创粉丝点击