题解:CF914C Travelling Salesman and Special Numbers
妙妙题。
一看到
最后简单说一下如何预处理,就是搞一个 __builtin 类函数中有一个 __builtin_popcount 函数,刚好就是求一个数在二进制下
::::warning[注意]
考虑到
并且
#include<bits/stdc++.h>
using namespace std;
const int mod = 1e9+7;
string a;
int n,k;
int f[1005][2][1005];
int cnt[1005];
int dfs(int x,int ding,int d)
{
if(x == n)
{
if(!d)
{
return 0;
}
return (cnt[d]+1 == k);
}
if(f[x][ding][d]!=-1)
{
return f[x][ding][d];
}
int ans = 0;
for(int i = 0;i<=(ding?a[x]-'0':1);++i)
{
int dingg = ding&&i == a[x]-'0';
ans = (ans+dfs(x+1,dingg,d+i))%mod;
}
return f[x][ding][d] = ans;
}
signed main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> a >> k;
if(k == 0)
{
cout << 1;
return 0;
}
for(int i = 2;i<=1000;++i)
{
cnt[i] = cnt[__builtin_popcount(i)]+1;
}
n = a.size();
memset(f,-1,sizeof(f));
if(k == 1)
{
cout << (dfs(0,1,0)-1+mod)%mod;
return 0;
}
cout << dfs(0,1,0);
return 0;
}
::::