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;
}