基础数学题

解线性方程

HDU-2669 Romantic

题意:

  求ax+by=1的一组x,y,且x为最小的非负值

思路:

  由于gcd等于1,所以判断gcd,如果gcd不等于则方程无解

  直接上exgcd即可

#include 
#include
#include 
#include 
#include 
#include 
#include
#include<set>
#include
#define INF 0x3f3f3f3f
#define DOF 0x7f7f7f7f
#define mem(a,b) memset(a,b,sizeof(a))
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
typedef long long ll;
using namespace std;

int exgcd(int a,int b,int &x,int &y)
{
    if(b==0){
        x=1,y=0;
        return a;
    }
    int r=exgcd(b,a%b,x,y);
    int tmp=x;
    x=y;
    y=tmp-a/b*y;
    return r;
}

int main()
{
    int a,b;
    while(~scanf("%d%d",&a,&b)){
        int x,y;
        int z=exgcd(a,b,x,y);
        if(z!=1)
            printf("sorry\n");
        else{
            while(x<0){
                x+=b;//保证x最小非负
                y-=a;
            }
            printf("%d %d\n",x,y);
        }
    }
}

 

逆元

HDU-1576 A/B

题意:

  要求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973)(我们给定的A必能被B整除,且gcd(B,9973) = 1)。

思路:

  直接求逆元

exgcd

#include 
#include
#include 
#include 
#include 
#include 
#include
#include<set>
#include
#define INF 0x3f3f3f3f
#define DOF 0x7f7f7f7f
#define mem(a,b) memset(a,b,sizeof(a))
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
typedef long long ll;
using namespace std;
const ll mod=9973;

void exgcd(ll a,ll b,ll &x,ll &y)
{
    if(b==0){
        x=1,y=0;
        return ;
    }
    exgcd(b,a%b,y,x);
    y-=a/b*x;
}
int main() {
    int t;
    cin >> t;
    while(t--) {
        ll n,b;cin>>n>>b;
        ll x=0,y=0;exgcd(b,mod,x,y);
        if(x<0) x+=mod;
        ll ans=(n*((x%mod+mod)%mod))%mod;
        cout<'\n';
    }
}

 

快速幂

#include 
#include
#include 
#include 
#include 
#include 
#include
#include<set>
#include
#define INF 0x3f3f3f3f
#define DOF 0x7f7f7f7f
#define mem(a,b) memset(a,b,sizeof(a))
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
typedef long long ll;
using namespace std;
const ll mod=9973;
ll qp(ll a,ll b)
{
    ll ans=1;
    while(b){
        if(b&1) ans=ans*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return ans;
}
int main() {
    int t;
    cin >> t;
    while(t--) {
        ll n,b;cin>>n>>b;
        ll c=qp(b,mod-2);
        ll qq=(n*c)%mod;
        cout<'\n';
    }
}

 

 

 

你可能感兴趣的:(基础数学题)