CF memsql Start[c]UP 2.0 A
A. Golden System
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output
Piegirl got bored with binary, decimal and other integer based counting systems. Recently she discovered some interesting properties about number
, in particular that q2 = q + 1, and she thinks it would make a good base for her new unique system. She called it "golden system". In golden system the number is a non-empty string containing 0's and 1's as digits. The decimal value of expressiona0a1...an equals to
.
Soon Piegirl found out that this system doesn't have same properties that integer base systems do and some operations can not be performed on it. She wasn't able to come up with a fast way of comparing two numbers. She is asking for your help.
Given two numbers written in golden system notation, determine which of them has larger decimal value.
Input
Input consists of two lines — one for each number. Each line contains non-empty string consisting of '0' and '1' characters. The length of each string does not exceed 100000.
Output
Print ">" if the first number is larger, "<" if it is smaller and "=" if they are equal.
Sample test(s)
input
1000
111
output
<
input
00100
11
output
=
input
110
101
output
>
Note
In the first example first number equals to
, while second number is approximately1.6180339882 + 1.618033988 + 1 ≈ 5.236, which is clearly a bigger number.
In the second example numbers are equal. Each of them is ≈ 2.618.
思路:最开始想推每一项的公式,不行,系数太大!后来想把前面的1全部转化为后面的1,发现这样的话也会2^100000太大!
后来发现如果一个字符串中出现的第一个1比另一个字符串中的第一个1高两位的话,就是这个串大,否则转化为后面的1(也就是第i位的1等于第i-1位的1和第i-2位的1)然后再逐位判断对多10^5。
处理时要把字符串反转,放在vector里面然后reverse(),竟然超时,换做直接字符串反转函数,AC 30ms!
#include<cstdio> #include<iostream> #include<cmath> #include<stdlib.h> #include<vector> #include<cstring> #include<map> #include<algorithm> #include<string.h> #define M(a,b) memset(a,b,sizeof(a)) #define INF 0x3f3f3f3f using namespace std; char a[],b[]; int num[]; vector<char> v1,v2; void strRev(char *s) { char temp, *end = s + strlen(s) - ; while( end > s) { temp = *s; *s = *end; *end = temp; --end; ++s; } } int main() { while(scanf("%s",a)==) { scanf("%s",b); int n = max(strlen(a),strlen(b)); strRev(a); strRev(b); int strla = strlen(a); int strlb = strlen(b); int tem = strlen(a)-strlen(b); if(tem < ) { for(int i = ;i<-tem;i++) a[strla+i] = ''; } else { for(int i = ;i<tem;i++) b[strlb+i] = ''; } /*for(int i = 0;i<n;i++) cout<<a[i]; cout<<endl; for(int i = 0;i<n;i++) cout<<b[i]; cout<<endl;*/ for(int i = ;i<n;i++) { if(a[i] == '' && b[i] == '') num[i+] = ; else if(a[i] == '' && b[i] == '') num[i+] = ; else if(a[i] == '' && b[i] == '') num[i+] = ; else if(a[i] == '' && b[i] == '') num[i+] = -; } num[] = ; num[] = ; //for(int i = 0;i<n+2;i++) cout<<num[i]; //cout<<endl; for(int i = n+;i>=;i--) { if(i==&&num[i]==) puts("="); if(num[i]==){puts(">"); break;} if(num[i]==-){puts("<"); break;} if(num[i] == ) continue; if(num[i] == ) { if(num[i-]==||num[i-]==) {puts(">"); break;} if(num[i-]==-) num[i-]+=, num[i-]+=; } if(num[i] == -) { if(num[i-]==||num[i-]==-) {puts("<"); break;} if(num[i-]==) num[i-]-=, num[i-]-=; } } } return ; }