A.Ksenia and Pan Scales

     大意是往天平上方法吗..用字符串随便搞一下就行..

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <queue>
#include <cstring>
using namespace std;
typedef long long ll;
int n,m;
string s;
int main()
{
//    freopen("in.txt","r",stdin);
    cin>>s;
    string ls="",rs="";

    int i=0;
    int l=0,r=0;
    m=0;
    while (s[i]!='|')
    {
        ls+=s[i];
        i++;
        l++;
    }
    i++;
    while (s[i])
    {
        rs+=s[i];
        r++;
        i++;
    }
    cin>>s;
    int len=s.length();
    for (int i=0; i<len; i++)
    {
        if (l<r)
        {
            ls=s[i]+ls;
            l++;
        }
        else rs=rs+s[i],r++;
    }
    if (ls.length()!=rs.length())
    {
        cout<<"Impossible"<<endl;
    }
    else
    {
        cout<<ls<<"|"<<rs<<endl;
    }
    return 0;
}




Number Busters

   注意到题目中若w-(x-b)实质上就是b-x+w。。也就是一直执行b=b-x,若不够减就补上一个w,那么假设一共做了k个操作,b总共减了k个x,那么我们只要算出来补了多少个w,就能算出a的值。首先对b,求一下b在0--w-1上对称点也就是b=w-b-1,然后可得到k次操作后,b=(b+k*x)%w,a=a-(b+k*x)/w.c=c-k 

a,c都是递减的,所以二分k就能求出答案..

    

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long ll;
ll a,b,w,x,c;
bool check(ll k)
{
    ll p=a-(b+k*x)/w;
    ll q=c-k;
    if (q<=p) return true;
    return false;
}
int main()
{
//    freopen("in.txt","r",stdin);
    cin>>a>>b>>w>>x>>c;
    b=w-b-1;
    if (c<=a)
    {
        cout<<0<<endl;
        return 0;
    }
    ll l=1LL,r=1LL<<62;
    ll m;
    while (l<r)
    {
        m=(l+r)>>1;
        if (!check(m)) l=m+1;
        else r=m;
    }
    cout<<l<<endl;
}



Arithmetic Progression

这题也没什么说的。。细心一下分情况讨论就行....

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <queue>
#include <cstring>
#include <set>
using namespace std;
typedef long long ll;
const int maxn=120000;
int n,m;
int num[maxn];
int sub[maxn];
int ts[10],ti[10];
int cs,ci;
int main()
{
//    freopen("in.txt","r",stdin);

    scanf("%d",&n);

    for (int i=0; i<n; i++)
    scanf("%d",&num[i]);
    sort(num,num+n);
    set<int> ss;
    ss.clear();
    for (int i=0; i<n-1; i++)
    {

        sub[i]=num[i+1]-num[i];
        ss.insert(sub[i]);
    }
    if (n==1)
    {
        printf("-1\n");
        return 0;
    }
    else if (n==2)
    {
        if (num[0]==num[1])
        {
            printf("1\n");
            printf("%d\n",num[0]);
            return 0;
        }

        if ((num[0]+num[1]) % 2==0)
        {
            printf("3\n");
            printf("%d %d %d\n",num[0]-sub[0],(num[0]+num[1])>>1,num[1]+sub[0]);
        }
        else
        {
            printf("2\n");
            printf("%d %d\n",num[0]-sub[0],num[1]+sub[0]);
            return 0;
        }
        return 0;
    }
    else
    {
        if (ss.size()>2)
        {
            printf("0\n");
            return 0;
        }
        if (ss.size()==1)
        {
            if (sub[0]==0)
            {
                printf("1\n");
                printf("%d\n",num[0]);
                return 0;
            }
            else
            {
                printf("2\n");
                printf("%d %d\n",num[0]-sub[0],num[n-1]+sub[0]);
                return 0;
            }
        }
        else
        if (ss.size()==2)
        {
            ci=cs=0;
            memset(ts,0,sizeof ts);
            memset(ti,0,sizeof ti);
            for (int i=0; i<n-1; i++)
            {
               if (cs==0)
               {
                   cs++;
                   ts[cs]=sub[i];
                   ci++;
                   ti[ci]=1;
               }
               else
               {
                   if (sub[i]!=ts[1])
                   {
                       ts[2]=sub[i];
                       ti[2]++;
                   }
                   else
                   {
                       ti[1]++;
                   }
               }
            }
            if (ti[1]!=1 && ti[2]!=1)
            {
                printf("0\n");
                return 0;
            }
            if (ts[1]*2!=ts[2] && ts[2]*2!=ts[1])
            {
                printf("0\n");
                return 0;
            }
            int mark;
            int mp;
            if (ti[1]==1) mark=ts[1],mp=ts[2];
            else mark=ts[2],mp=ts[1];

            if (mark*2==mp && ti[1]==1 && ti[2]==1)
            swap(mp,mark);

            if (mp*2!=mark)
            {
                printf("0\n");
                return 0;
            }
            int out=0;

            for (int i=0; i<n-1; i++)
            if (sub[i]==mark)
            out=(num[i]+num[i+1])>>1;
            printf("1\n");
            printf("%d\n",out);
            return 0;
        }
    }

    return 0;
}