博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj 3252 Round Numbers(数学)
阅读量:4709 次
发布时间:2019-06-10

本文共 1579 字,大约阅读时间需要 5 分钟。

链接:http://poj.org/problem?id=3252

题意:一个数写成二进制,0不少于1就是round number,求给定区间内round number的个数。

分析:显然第一步转化为0到n的round number个数。。设n写成二进制有len位,第一位取0时,后面只要满足0的个数要求就行了,不用考虑是否比n大。。可以先预处理一下长度不大于len的round number个数,记做t[len],t[len]=t[len-1]+∑C(len-1  k) , (k=0,1,...,len/2-1)。

然后第一位取1时,往后是0的位只能取0,遇到第一个1时,再分情况考虑这一位为1和为0,然后考虑还需要多少位,往下递归即可。

1 #include
2 #include
3 #include
4 using namespace std; 5 const int maxn=35; 6 int C[maxn][maxn],sum[maxn][maxn][maxn],t[maxn]; 7 int start,finish; 8 void CalC(){ 9 for(int i=1;i
=len)return n+1;34 int t=len-1;35 while(t>=0&&(n&(1<<(t-1)))==0){36 t--;37 }38 return f(n-(1<<(len-1)),c-1,t)+sum[len-1][0][c];39 }40 int solve(int n){41 if(n==0)return 1;42 int k=1<<30,len=31;43 while((k&n)==0){44 k>>=1;len--;45 }46 int l=len-1;47 while(l>=0&&(n&(1<<(l-1)))==0){48 l--;49 }50 return t[len-1]+f(n-(1<<(len-1)),(len-2)/2,l);51 }52 //bool Is_round(int n){53 // int k=1,a=0,b=0;54 // while(k<=n){55 // if(k&n)a++;56 // else b++;57 // k<<=1;58 // }59 // if(a<=b)return true;60 // return false;61 //}62 //int test(int n){63 // int count=0;64 // for(int i=1;i<=n;i++){65 // if(Is_round(i))count++;66 // }67 // return count+1;68 //}69 int main(){70 CalC();71 CalT();72 int n;73 // while(cin>>n){74 // cout<
<<' '<
<
>start>>finish;77 cout<
<

 

转载于:https://www.cnblogs.com/7391-KID/p/7282581.html

你可能感兴趣的文章
linux下查看文件夹的大小
查看>>
mvc页面中,显示自定义时间格式
查看>>
不支持uri格式
查看>>
Linux crontab计划任务
查看>>
疯掉的拼接
查看>>
Jupyter Notebook 快捷键使用指南
查看>>
SVN添加自动忽略文件.settings .project .classpath target等
查看>>
[THUPC2019]过河卒二(组合数学,容斥原理)
查看>>
238. Product of Array Except Self
查看>>
多线程技术交流提纲
查看>>
Java工程师必备书单
查看>>
InnoDB一定会在索引中加上主键吗
查看>>
Scala-字符串操作
查看>>
转一篇《计算机的潜意识》的文章
查看>>
[原] 蒙古文网站汇聚地
查看>>
不平衡学习 Learning from Imbalanced Data
查看>>
2014那些事之跳槽思考
查看>>
Java作业八(2017-10-30)
查看>>
iso移动Safari页面缓存
查看>>
visual studio code 配置python环境方法,不断更新中......
查看>>