SGU 126 Boxes
2012-03-27 13:06
316 查看
先算出a和b的最大公约数,然后a=a/gcd;b=b/gcd; 如果a+b是奇数那么返回-1,否则继续这样搞,a+b的和每次至少比上次少二分之一,所以这个算法复杂度是O(logN)级别的,还可以证明a和b的和一定是2的n次方,这个可以从上述算法中的每一步推出~
#include<iostream> #include<vector> #include<algorithm> #include<cstdio> #include<queue> #include<stack> #include<string> #include<map> #include<set> #include<cmath> #include<cassert> #include<cstring> #include<iomanip> using namespace std; #ifdef _WIN32 #define i64 __int64 #define out64 "%I64d\n" #define in64 "%I64d" #else #define i64 long long #define out64 "%lld\n" #define in64 "%lld" #endif #define FOR(i,a,b) for( int i = (a) ; i <= (b) ; i ++) #define FF(i,a) for( int i = 0 ; i < (a) ; i ++) #define FFD(i,a) for( int i = (a)-1 ; i >= 0 ; i --) #define S64(a) scanf(in64,&a) #define SS(a) scanf("%d",&a) #define LL(a) ((a)<<1) #define RR(a) (((a)<<1)+1) #define SZ(a) ((int)a.size()) #define PP(n,m,a) puts("---");FF(i,n){FF(j,m)cout << a[i][j] << ' ';puts("");} #define pb push_back #define CL(Q) while(!Q.empty())Q.pop() #define MM(name,what) memset(name,what,sizeof(name)) #define read freopen("in.txt","r",stdin) #define write freopen("out.txt","w",stdout) const int inf = 0x3f3f3f3f; const i64 inf64 = 0x3f3f3f3f3f3f3f3fLL; const double oo = 10e9; const double eps = 10e-10; const double pi = acos(-1.0); i64 gcd(i64 _a, i64 _b) { if (!_a || !_b) { return max(_a, _b); } i64 _t; while (_t = _a % _b) { _a = _b; _b = _t; } return _b; }; i64 ext_gcd (i64 _a, i64 _b, i64 &_x, i64 &_y) { if (!_b) { _x = 1; _y = 0; return _a; } i64 _d = ext_gcd (_b, _a % _b, _x, _y); i64 _t = _x; _x = _y; _y = _t - _a / _b * _y; return _d; } i64 invmod (i64 _a, i64 _p) { i64 _ans, _y; ext_gcd (_a, _p, _ans, _y); _ans < 0 ? _ans += _p : 0; return _ans; } i64 f(i64 a,i64 b) { if(a==0||b==0) { return 0; } i64 c=gcd(a,b); a/=c; b/=c; if(a==b) { return 1; } if((a+b)%2!=0) { return -1; } if(a>b) { i64 nowa = a-b; i64 nowb = b+b; i64 temp = f(nowa,nowb); if(temp==-1) { return -1; } else { return temp + 1; } } else if(a<b) { i64 nowa = a+a; i64 nowb = b-a; i64 temp = f(nowa,nowb); if(temp==-1) { return -1; } else { return temp + 1; } } } int main() { i64 a,b; while(cin>>a>>b) { cout<<f(a,b)<<endl; } return 0; }
相关文章推荐
- SGU 126. Boxes 找规律 数学 二进制
- SGU 126 - Boxes
- SGU 126 Boxes(数论)
- SGU 126 Boxes(模拟题|二进制)
- sgu126:Boxes
- SGU126 Boxes
- SGU126 Boxes
- sgu 126 Boxes
- SGU 126 Boxes(模拟题|二进制)
- SGU126-Boxes
- SGU 126 Boxes
- sgu 126 Boxes 数学推导(打表找规律??...)
- 找规律 SGU 126 Boxes
- SGU 126. Boxes --- 模拟
- Boxes - SGU 126(找规律)
- 数学题/sgu 126 Boxes
- sgu 135 + 184 +117+126+114+118+127
- SGU 126
- UVa--12657 Boxes in a line(双向链表)
- 动态规划(方案还原):SGU 104 Little shop of flowers