#include<bits/stdc++.h>
using namespace std;
int n,k;
long long b[200005],g[15],ksm[60],ans;
map<long long,bool>mp;
int find(long long x){
if(x==1)return 1;
int l=1,r=10;
while(l<r)
{
int mid=(l+r)>>1;
if(g[mid]<x)l=mid+1;
else r=mid;
}
return l;
}
bool pd(long long x)
{
//cout<<x<<"\n";
if(x==1)return mp[x];
if(mp[x]==1)return 1;
int c=find(x);
long long cha=x-g[c-1];
int w=g[c-2];
if(cha%ksm[c-1]==0)w+=cha/ksm[c-1];
else w+=(cha+ksm[c-1])/ksm[c-1];
return pd(w);
}
long long q(long long x)
{
int c=find(x);
long long re=1,d=1;
for(int i=c+1;i<=n;i++)
{
//cout<<c<<" "<<i<<" "<<re<<" "<<d<<"\n";
d*=ksm[i-1];re+=d;
}
return re;
}
int main ()
{
//freopen("chimes.in","r",stdin);
//freopen("chimes.out","w",stdout);
ksm[0]=1;
for(int i=1;i<=55;i++)ksm[i]=ksm[i-1]*2;
for(int i=1;i<=10;i++)g[i]=g[i-1]+ksm[i*(i-1)/2];
scanf("%d%d",&n,&k);
ans=g[n];
for(int i=1;i<=k;i++)scanf("%lld",&b[i]);
sort(b+1,b+k+1);
for(int i=1;i<=k;i++)
{
if(pd(b[i])==0)
{
mp[b[i]]=1;
ans-=q(b[i]);
//cout<<"include:"<<b[i]<<"\n";
//cout<<q(b[i])<<"\n";
}
//cout<<"--------------\n";
}
printf("%lld",ans);
}
数据要求:
1≤n≤10
1≤k≤2×105
保证 Ci 编号合法且不重复
内存限制: 256 MiB
时间限制: 1000 ms
题目类型: 传统
评测方式: 文本比较
求为什么 TLE 了?