Codeforces Round #262 (Div. 2)-A,B,C,D

时间:2022-12-19 16:36:59

A. Vasya and Socks

水题就不用多说了,直接暴力枚举就完事了。

#include <iostream>
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<vector>
#include<algorithm>
#include<string.h>
using namespace std;
#define LL __int64
int main()
{
    int n,k;
    while(~scanf("%d%d",&n,&k))
    {
        int m=n;
        int ans=n;
        int yu=0;
        while(m)
        {
            m=m+yu;
            yu=m%k;
            m=m/k;
            ans+=m;
        }
        cout<<ans<<endl;
    }
    return 0;
}

B. Little Dima and Equation

也不用说,水题一个,直接枚举s(x),然后得到x,然后根据x推出s(x)是不是合适。

当时把81写成了72,不由的十分悲伤,sad.

#include <iostream>
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<vector>
#include<algorithm>
#include<string.h>
using namespace std;
#define LL __int64
#define INF 1000000000
vector<int>vec;
LL pows(LL x,LL y)
{
    LL ans=1;
    while(y--)ans=ans*x;
    return ans;
}
int dus(LL x)
{
    int ans=0;
    while(x)
    {
        ans=ans+x%10;
        x=x/10;
    }
    return ans;
}
int main()
{
    int n,k;
    int a,b,c;
    while(~scanf("%d%d%d",&a,&b,&c))
    {
        LL ans=0;
        vec.clear();
        for(int i=1;i<=81;i++)
        {
            ans=(LL)b;
            ans=ans*pows(i,a);
            ans=ans+(LL)c;
            if(ans>=INF)break;
            if(ans<=0)continue;
            if(dus(ans)==i)vec.push_back(ans);
        }
        cout<<vec.size()<<endl;
        sort(vec.begin(),vec.end());
        for(int i=0;i<vec.size();i++)
        {
            printf("%d",vec[i]);
            if(i!=vec.size()-1)printf(" ");
            else puts("");
        }
    }
    return 0;
}

C. Present

二分+贪心。也是一种水题的表现形式。。。。

二分一下结果,贪心看当前结果能不能达到。

#include <iostream>
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<vector>
#include<algorithm>
#include<string.h>
using namespace std;
#define LL __int64
#define INF 1000000000
#define maxn 220000
LL a[maxn];
LL b[maxn];
LL flag[maxn];
LL n,w;
LL qiu(LL x)
{
    memset(flag,0,sizeof(flag));
    for(LL i=1;i<=n;i++)
    {
        b[i]=x-a[i];
    }
    LL ch=0;
    LL ans=0;
    for(LL i=1;i<=n;i++)
    {
        ch-=flag[i];
        b[i]-=ch;
        if(b[i]<0)b[i]=0;
        flag[i+w]+=b[i];
        ch+=b[i];
        ans+=b[i];
    }
    return ans;
}
int main()
{
    LL m;
    while(~scanf("%I64d%I64d%I64d",&n,&m,&w))
    {
        for(LL i=1;i<=n;i++)scanf("%I64d",&a[i]);
        LL l=0;
        LL r=1e9;
        r=r*2;
        LL mid=(l+r)/2;
        while(l<r)
        {
            if(qiu(mid)>m)r=mid;
            else l=mid+1;
            mid=(l+r)/2;
        }
        mid--;
        cout<<mid<<endl;
    }
    return 0;
}

D. Little Victor and Set

写这个题的时候要多悲剧有多悲剧,竟然在我认为最不可能错的地方写错了。

我很悲伤.

n=r-l+1;

若n<=20,很明显状态压缩就OK。

若k<=3.

当k=1时,很明显取l。

当k=2时,很明显取两个相邻的,并且只有末位不同的数,他们的异或结果为1.

当k=3时,第一个数取l,然后假如结果为0,算出剩下两个数的最小值。如果两个数最大的

不大于r,那我们就取这三个数,否则取两个数使得结果为1.

当k>=4时:

对于下面两个数交替处:

..........0111110                  k-2

..........0111111                  k-1

..........1000000                  k

..........1000001                  k+1

很明显我们可以看出来k-2,k-1,k,k+1的异或值为0。

因为n>20,我们一定能找出这种k。

#include <iostream>
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<vector>
#include<algorithm>
#include<string.h>
using namespace std;
#define LL __int64
#define INF 1000000000
#define maxn 220000
void dos1(LL l,LL r,LL k)
{
    LL n=r-l+1;
    LL st=((LL)1)<<n;
    LL ans=0;
    LL res=r+100;
    LL rst=0;
    LL len=0;
    for(LL i=1; i<st; i++)
    {
        ans=0;
        len=0;
        for(LL j=0; j<n; j++)
        {
            if(i&(((LL)1)<<j))
            {
                ans=ans^(j+l);
                len++;
            }
        }
        if(len>k)continue;
        if(res>ans)
        {
            res=ans;
            rst=i;
        }
    }
    len=0;
    for(LL i=0; i<n; i++)
    {
        if(rst&(((LL)1)<<i))len++;
    }
    cout<<res<<endl;
    cout<<len<<endl;
    for(LL i=0; i<n; i++)
    {
        if(rst&(((LL)1)<<i))
        {
            len--;
            cout<<(i+l);
            if(len)cout<<" ";
            else cout<<endl;
        }
    }
}
LL dos2(LL l,LL r,LL ks)
{
    for(LL i=50; i>=0; i--)
    {
        if((l&(((LL)1)<<i))!=((r&(((LL)1)<<i))))
        {
            LL k=((LL)1)<<i;
            LL n=(l>>i);
            n=(n<<i);
            n=n+k;
            k=n;
            if(k-2>=l&&k+1<=r)
            {
                return k;
            }
            else if(k-2<l)return dos2(k,r,ks);
            else if(k+1>r)return dos2(l,k-1,ks);
        }
    }
    return 0;
}
void dos3(LL l,LL r,LL k)
{
    if(k==1)
    {
        cout<<l<<endl;
        cout<<"1"<<endl;
        cout<<l<<endl;
        return;
    }
    if(k==2)
    {
        cout<<"1"<<endl;
        cout<<"2"<<endl;
        if(l&1)l++;
        cout<<l<<" "<<l+1<<endl;
        return;
    }
    LL len=0;
    LL n=l;
    while(n)
    {
        len++;
        n=n/2;
    }
    LL a,b;
    a=b=0;
    int leap=0;
    a=b=(((LL)1)<<len);
    for(LL i=len; i>=0; i--)
    {
        if(l&(((LL)1)<<i))
        {
            if(!leap)b+=(((LL)1)<<i);
            else a+=(((LL)1)<<i);
            leap++;
        }
    }
    if(b<=r)
    {
        cout<<"0"<<endl;
        cout<<"3"<<endl;
        cout<<l<<" "<<a<<" "<<b<<endl;
    }
    else
    {
        cout<<"1"<<endl;
        cout<<"2"<<endl;
        if(l&1)l++;
        cout<<l<<" "<<l+1<<endl;
    }
}
int main()
{
    LL l,r,k;
    while(~scanf("%I64d%I64d%I64d",&l,&r,&k))
    {
        LL n=r-l+1;
        if(n<=20)
        {
            dos1(l,r,k);
            continue;
        }
        if(k<=3)
        {
            dos3(l,r,k);
            continue;
        }
        LL ans=dos2(l,r,k);
        cout<<"0"<<endl;
        cout<<"4"<<endl;
        for(LL i=ans-2; i<=ans+1; i++)
        {
            cout<<i;
            if(i!=ans+1)cout<<" ";
            else cout<<endl;
        }

    }
    return 0;
}