codeforces708b// Recover the String //AIM Tech Round 3 (Div. 1)

Posted gaudar

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了codeforces708b// Recover the String //AIM Tech Round 3 (Div. 1)相关的知识,希望对你有一定的参考价值。

题意:有一个01组成的串,告知所有长度为2的子序列中,即00,01,10,11,的个数a,b,c,d。输出一种可能的串。

先求串中0,1的数目x,y。

首先,如果00的个数a不是0的话,设串中有x个0,C(X,2)=a,那么x*(x+1)=2a,解方程(其实只要看sqrt(x)*(sqrt(x)+1)等不等于2a),x没有整数解就IMPOSSIBLE。同理得出1的个数y。如果00个数是0看01个数。

第二,如果x*y!=b+c则IMPOSSIBLE,具体自己举个例子就明白。

最后,先将所有的0组成一个串str,再从右边开始逐个加1。具体来说,在str最右加1个1,01数量增加x个,倒二位置加,增加x-1个......总共要b个01,先往最右增加b/x个1。然后还缺b1个01,在倒二位置加b1/(x-1)个......循环结束。

乱码。。。。。。

//#pragma comment(linker,"/STACK:1024000000,1024000000") 
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<vector>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<algorithm>
#include <stack>
#include <list>
using namespace std;
const int SZ=1000010,INF=0x7FFFFFFF;
typedef long long lon;

int main()
{
    std::ios::sync_with_stdio(0);
    //freopen("d:\1.txt","r",stdin); 
    lon a00,a01,a10,a11;
    cin>>a00>>a01>>a10>>a11;
    bool ok1=0,ok2=0;
    lon sq1=sqrt(a00*2),sq2=sqrt(a11*2);
    if(sq1*(sq1+1)==2*a00)ok1=1;
    if(sq2*(sq2+1)==2*a11)ok2=1;
    lon num0=sq1+1,num1=sq2+1;
    if(a00==0&&a01==0&&a10==0)num0=0;
    if(a11==0&&a01==0&&a10==0)num1=0;
    if(num0==num1&&num0==0)cout<<0<<endl;
    else if(ok1&&ok2)
    {
        if(a01+a10!=num0*num1)cout<<"Impossible"<<endl;
        else if(num0==0)
        {
            cout<<string(num1,1)<<endl;
        }
        else if(num1==0)
        {
            cout<<string(num0,0)<<endl;
        }
        else
        {
            string str(num0,0);
            lon right1num=a01/num0;
            lon rem=num1-right1num;
            str+=string(right1num,1);
            lon stillneed01=a01-num0*(a01/num0);    
            for(int i=(int)str.size()-right1num-1,j=1;i>=0;--i,++j)
            {
                lon cur0=num0-j;
                if(cur0==0)
                {
                    str=string(rem,1)+str;
                    break;
                }
                int right1num=stillneed01/cur0;
                str.insert(str.begin()+i,right1num,1);
                stillneed01-=cur0*right1num;
                rem-=right1num;
            }
            cout<<str<<endl;
        }
    }
    else cout<<"Impossible"<<endl;
    return 0;
}

 

以上是关于codeforces708b// Recover the String //AIM Tech Round 3 (Div. 1)的主要内容,如果未能解决你的问题,请参考以下文章

codeforces708b// Recover the String //AIM Tech Round 3 (Div. 1)

cf708B. Recover the String---(构造法)

CodeForces 708B Recover the String

CF708B Recover the String 构造

Codeforces Problem 708A Letters Cyclic Shift

Codeforces Round #708 (Div. 2) B - M-arrays