题解 CF261C Maxim and Matrix

题目:CF261C Maxim and Matrix 

先打个表发现是: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 }
View Code
原文地址:https://www.cnblogs.com/Kylin-xy/p/11675288.html