基础数学题
解线性方程
HDU-2669 Romantic
题意:
求ax+by=1的一组x,y,且x为最小的非负值
思路:
由于gcd等于1,所以判断gcd,如果gcd不等于则方程无解
直接上exgcd即可
#include <iostream> #include<algorithm> #include <cstdio> #include <cstdlib> #include <cstring> #include <queue> #include<map> #include<set> #include<sstream> #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 <iostream> #include<algorithm> #include <cstdio> #include <cstdlib> #include <cstring> #include <queue> #include<map> #include<set> #include<sstream> #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<<ans<<'\n'; } }
快速幂
#include <iostream> #include<algorithm> #include <cstdio> #include <cstdlib> #include <cstring> #include <queue> #include<map> #include<set> #include<sstream> #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<<qq<<'\n'; } }