先打个表发现是:1 2 2 4 2 4 4 8 4 8 8 16这种形式的。
然后我们就知道这题就是求 n+1以内2的每一个次幂出现的次数.
这个有一个套路的数位dp板子去求它。直接放代码。
对了最后要减去(now==1),第一个1 不能要。还有读入进来n++;
1 #include<stdio.h> 2 #define it register int 3 #define il inline 4 typedef long long ll; 5 ll n,t,now,f[105]; 6 il void fr(ll &num){ 7 num=0;char c=getchar();int p=1; 8 while(c<'0'||c>'9') c=='-'?p=-1,c=getchar():c=getchar(); 9 while(c>='0'&&c<='9') num=num*10+c-'0',c=getchar(); 10 num*=p; 11 } 12 int main(){ 13 fr(n),fr(t);++n; 14 if(t&(t-1)) return putchar('0'),0; 15 for(it j=60;~j;--j){ 16 for(it i=60;i;--i) f[i]+=f[i-1]; 17 if(n>>j&1) ++f[now++]; 18 } 19 ++f[now]; 20 now=0;while(t) t>>=1,++now; 21 printf("%lld",f[now]-(now==1)); 22 return 0; 23 }