Codeforces Round #772 D Infinite Set
题目链接:D Infinite Set
void solve(){
dp[0]=1;dp[1]=1LL;
rep(i,2,200000){
dp[i]=(dp[i-1]+dp[i-2])%mod;
}
pre[0]=1;
rep(i,1,200000) pre[i]=(pre[i-1]+dp[i])%mod;
cin>>n>>p;
rep(i,1,n) cin>>a[i];
sort(a+1,a+1+n);
rep(i,1,n){
int x=a[i],f=0;
//先判断之前是否算过了(看数的末尾是否有一个1或两个0)
while(x){
if(mp[x]){
f=1;
break;
}
if(x%2) x/=2;
else if(x%4==0) x/=4;
else break;
}
mp[a[i]]=1;
if(f) continue;
x=a[i];
int cnt=0;
while(x){
x/=2;
cnt++;
}
// bug2(i,cnt);
if(cnt<=p) //如果位数小于给的位数,加答案
ans+=pre[p-cnt];
ans%=mod;
}
cout<<ans<<endl;
}