Western Subregional of NEERC, Minsk, Wednesday, November 4, 2015 Problem A. A + B

Problem A. A + B

题目连接:

http://opentrains.snarknews.info/~ejudge/team.cgi?SID=c75360ed7f2c7022&all_runs=1&action=140

Description

Kastus recently got to know about complex numbers. But from all real numbers he was interested only
in integers, so he decided to learn only numbers of the form a + bi where i
2 = −1, a and b are integers
(he had no idea that he was not the first who got interested in these numbers and that they are called
Gaussian integers).
It would be nice if Kastus knew how to represent such numbers in computer memory. . . He is already
familiar with some number systems, for example binary and negabinary. He decided that a pair of integers
is not an option. One number should look like one number. Kastus had been thinking long and hard what
to do, and finally saw an elegant solution: take a number system in base i − 1 and the digits 0 and 1. In
other words, the expression
a + bi = dn−1 . . . d1d0i−1
means that
a + bi = (i − 1)n−1
· dn−1 + . . . + (i − 1)1
· d1 + (i − 1)0
· d0.
For example, 1101i−1 = (i − 1)3 + (i − 1)2 + (i − 1)0 = 3.
Kastus proved that any Gaussian integer can be represented using this notation in the only way (if it has
no leading zeros). In addition, he noticed that all the numbers having no more than n significant digits
form a dragon curve when he marked them on the complex plane.
Now he is interested in a new simple question: how to make the usual arithmetic operations with the
numbers written in this notation. He decided to start with addition, despite the fact that subtraction can
not be expressed through addition, whereas addition is expressed through subtraction. But even with this
simple question he needs help!

Input

Each of two lines contains one number written in base i − 1 with no more than 1 000 000 digits. The
numbers don’t have leading zeros.

Output

Output the sum of the two given numbers in the same notation.

Sample Input

1100
1101

Sample Output

111010001

Hint

题意

定义了一个复数进制,然后给你俩复数进制表示的复数,求这俩复数相加后的复数进制表示方法

题解:

我们观察得知,其实(i-1)3+(i-1)2 = 2,那么就表示2 = 1100,根据这个不停的去做就好了。

这道题感觉智商被压制了。。。。

代码

#include<bits/stdc++.h>
using namespace std;
const int maxn = 3e6+7;
string s1,s2;
string ans;
int a[maxn],b[maxn];
int c[maxn];
int main(){
    cin>>s1>>s2;
    reverse(s1.begin(),s1.end());
    reverse(s2.begin(),s2.end());
    for(int i=0;i<s1.size();i++)
        a[i]=s1[i]-'0';
    for(int i=0;i<s2.size();i++)
        b[i]=s2[i]-'0';
    for(int i=0;i<maxn;i++){
        c[i]=c[i]+a[i]+b[i];
        while(c[i]>=2){
            c[i]-=2;
            c[i+2]++;
            c[i+3]++;
        }
    }
    int flag = 0;
    for(int i=maxn-1;i>=0;i--){
        if(c[i])flag = 1;
        if(flag)cout<<c[i];
    }
    if(flag==0)cout<<"0";
    cout<<endl;
}
posted @ 2016-08-13 01:02  qscqesze  阅读(204)  评论(0编辑  收藏  举报