P5968 [POI2017]Reprezentacje ró?nicowe(暴力+二分)
P5968 [POI2017]Reprezentacje ró?nicowe
第一眼,不会。看完题解,这是个sb题,我是sb
仔细观察题面可以发现,每出现两个数,就会有一次
所以我们可以暴力打出
#include<bits/stdc++.h>
#define ll long long
using namespace std;
map<ll,pair<int,int> > s;
map<ll,pair<int,int> >::iterator it;
ll a[110],b[10010];
const ll INF=1e9;
int main()
{
int q,n,cnt=0;
scanf("%d",&q);
a[1]=1,a[2]=2;
s[1]=make_pair(2,1);
for(n=3;;n++)
{
if(n&1)a[n]=a[n-1]<<1;
else for(int i=1;;i++)
{
if(!s.count(i))
{
a[n]=a[n-1]+i;
break;
}
}
for(int i=1;i<n;i++)
s[a[n]-a[i]]=make_pair(n,i);
if(!(n&1)&&a[n]>INF)break;
}
for(it=s.begin();it!=s.end();it++)
b[++cnt]=it->first;
while(q--)
{
int x;
scanf("%d",&x);
if(s.count(x))
printf("%d %d\n",s[x].first,s[x].second) ;
else
{
int y=lower_bound(b+1,b+cnt+1,x)-b-1;
printf("%d %d\n",n+(x-y)*2,n+(x-y)*2-1);
}
}
return 0;
}