my扩展欧几里得
2017-10-11 21:50
120 查看
问题符合 a*x + b*y = c 的格式求解x或y的最小值
参考文章
练习:The Balance
练习:
ll e_gcd(ll a,ll b,ll& x,ll& y){ if(b==0){ x=1;y=0; return a; } ll ans = e_gcd(b,a%b,x,y); ll tmp = x; x=y; y=tmp-a/b*y; return ans; } ll acl(ll a,ll b,ll c){ ll x,y; ll gcd = e_gcd(a,b,x,y); if(c%gcd!=0) return -1; x *= c/gcd; b /= gcd; if(b<0) b=-b; ll ans = x%b; if(ans<0) ans+=b; return ans; }
参考文章
练习:The Balance
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #define INT_MAX 2147483647 using namespace std; typedef long long ll; ll x,y; ll abs(ll a){ if(a<0) return -a; else return a; } ll e_gcd(ll a,ll b){ if(b==0){ x=1;y=0; return a; } ll ans = e_gcd(b,a%b); ll tmp = x; x=y; y=tmp-a/b*y; return ans; } void acl(ll a,ll b,ll c){ ll xx,yy,tx,ty; int flag=0; if(a<b){ swap(a,b); flag = 1; } ll gcd = e_gcd(a,b); x*=c/gcd; y*=c/gcd;//求出二元一次方程的解x,y ll k =y*gcd/a,ans=INT_MAX;//利用y=a/gcd * t 求出 t 的值 for(ll i=k-5;i<k+5;i++){ //由于最后求得是 abs(x+b/gcd*t)+abs(y-a/gcd*) 的最小值,t是后者的最小,所以和最小在t的附近,遍历即可 xx = x + b/gcd*i; yy = y - a/gcd*i; if(abs(xx)+abs(yy)<ans){ ans=abs(xx)+abs(yy); tx=xx; ty=yy; } } if(flag == 0){ cout << abs(tx) << ' ' << abs(ty); }else{ cout << abs(ty) << ' ' << abs(tx); } cout << endl; } int main(){ ll a,b,d; while(scanf("%lld%lld%lld",&a,&b,&d)!=EOF){ if(a==0&&b==0&&d==0) break; acl(a,b,d); } return 0; }
练习:
C Looooops
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #define INT_MAX 2147483647 using namespace std; typedef long long ll; ll x,y; ll e_gcd(ll a,ll b){ if(b==0){ x=1;y=0; return a; } ll ans = e_gcd(b,a%b); ll tmp = x; x=y; y=tmp-a/b*y; return ans; } ll acl(ll a,ll b,ll c){ ll gcd = e_gcd(a,b); if(c%gcd!=0) return -1; x*=(c/gcd); b/=gcd; if(b<0) b=-b; ll ans = x%b; if(ans<0) ans += b; return ans; } int main(){ ll a,b,c,k; while(scanf("%lld%lld%lld%lld",&a,&b,&c,&k)!=EOF){ if(a==0&&b==0&&c==0&&k==0) break; ll b1 = (ll)1<<(k);//注意使用强制转换 ll ans = acl(c,b1,b-a); if(ans==-1) cout << "FOREVER" ; else cout << ans; cout << endl; } return 0; }
相关文章推荐
- hdu 2669(扩展欧几里得)
- 当我真正理解了扩展欧几里得定理
- UVa 10673 - Play with Floor and Ceil (扩展欧几里得)
- 关于逆元(证明扩展欧几里得定理)
- 扩展欧几里得
- CodeForces 7C Line (扩展欧几里得)
- 扩展欧几里得
- 组合数,快速幂,扩展欧几里得及其求逆元模板
- HUD 1576 A/B【逆元 -> 扩展欧几里得】
- [poj1061]: 青蛙的约会(扩展欧几里得)
- HDU 2669 (扩展欧几里得入门)
- poj 1061 青蛙的约会 ——扩展欧几里得
- code1213 解的个数 扩展欧几里得
- BZOJ1951 [Sdoi2010]古代猪文 【费马小定理 + Lucas定理 + 中国剩余定理 + 逆元递推 + 扩展欧几里得】
- 数论-hdu-1576-A/B-逆元-扩展欧几里得
- 51nod 1352 集合计数(扩展欧几里得)
- hdu 5114 Collision 扩展欧几里得
- POJ 1061 && POJ 2142 两道扩展欧几里得简单题
- BZOJ_P1407&Codevs_P1747 [NOI2002]Savage(数论+扩展欧几里得)
- hdu 1576(数论之扩展欧几里得)