sgu255:Winsock 3 Beta(二进制分析)
2015-06-07 00:08
316 查看
题目大意:
~~~~~~定义A(p)={x|x≤p,x的二进制表示上只有3个1},f(x)=|A(2x)−A(x)|A(p)=\{x|x\leq p,x的二进制表示上只有3个1\},f(x)=|A(2x)-A(x)|
~~~~~~有n(n≤100)n(n\leq 100)组数据,每组数据给出m(m≤231−1)m(m\leq 2^{31}-1),询问f(x)=mf(x)=m是否有唯一解。
分析:
~~~~~~我们考虑f(x)→f(x+1)f(x)\rightarrow f(x+1)的变化。
~~~~~~如果x+1x+1满足条件,那么2(x+1)2(x+1)必定也满足条件,去掉x+1x+1新添一个2(x+1)2(x+1),f(x)→f(x+1)f(x)\rightarrow f(x+1)便只受2x+12x+1的影响。
~~~~~~如果x+1x+1不满足条件,那么2(x+1)2(x+1)必定也不满足条件,f(x)→f(x+1)f(x)\rightarrow f(x+1)仍只受2x+12x+1的影响。
~~~~~~综上,f(x)→f(x+1)f(x)\rightarrow f(x+1)只受2x+12x+1的影响,2x+12x+1为奇数。
~~~~~~如果2x+12x+1满足条件,那么f(x+1)=f(x)+1f(x+1)=f(x)+1,否则f(x+1)=f(x)f(x+1)=f(x)。
~~~~~~若f(x)=mf(x)=m有唯一解,那么第mm个满足条件的奇数+2=+2=第m+1m+1个满足条件的奇数。也就是说第mm个满足条件的奇数形如100..011100..011,既满足末两位为11,另一个11与末两位之间至少有一个00。
~~~~~~至于怎么求第mm个满足条件的奇数,数学方法oror数位dpdp均可。
AC code:
~~~~~~定义A(p)={x|x≤p,x的二进制表示上只有3个1},f(x)=|A(2x)−A(x)|A(p)=\{x|x\leq p,x的二进制表示上只有3个1\},f(x)=|A(2x)-A(x)|
~~~~~~有n(n≤100)n(n\leq 100)组数据,每组数据给出m(m≤231−1)m(m\leq 2^{31}-1),询问f(x)=mf(x)=m是否有唯一解。
分析:
~~~~~~我们考虑f(x)→f(x+1)f(x)\rightarrow f(x+1)的变化。
~~~~~~如果x+1x+1满足条件,那么2(x+1)2(x+1)必定也满足条件,去掉x+1x+1新添一个2(x+1)2(x+1),f(x)→f(x+1)f(x)\rightarrow f(x+1)便只受2x+12x+1的影响。
~~~~~~如果x+1x+1不满足条件,那么2(x+1)2(x+1)必定也不满足条件,f(x)→f(x+1)f(x)\rightarrow f(x+1)仍只受2x+12x+1的影响。
~~~~~~综上,f(x)→f(x+1)f(x)\rightarrow f(x+1)只受2x+12x+1的影响,2x+12x+1为奇数。
~~~~~~如果2x+12x+1满足条件,那么f(x+1)=f(x)+1f(x+1)=f(x)+1,否则f(x+1)=f(x)f(x+1)=f(x)。
~~~~~~若f(x)=mf(x)=m有唯一解,那么第mm个满足条件的奇数+2=+2=第m+1m+1个满足条件的奇数。也就是说第mm个满足条件的奇数形如100..011100..011,既满足末两位为11,另一个11与末两位之间至少有一个00。
~~~~~~至于怎么求第mm个满足条件的奇数,数学方法oror数位dpdp均可。
AC code:
[code]#include <cstdio> #include <cmath> #include <cstdlib> #include <cstring> #include <cctype> #include <algorithm> #include <string> #include <sstream> #include <iostream> #include <map> #include <set> #include <list> #include <stack> #include <queue> #include <vector> #define pb push_back #define mp make_pair typedef long long LL; typedef double DB; typedef long double LD; using namespace std; int a[4]; int num[100000][4]; void pre() { for(int i = 0; i <= 100000; ++i) { if(!i) num[i][1] = 1; if(i) num[i][2] = 1; if(i > 1) num[i][3] = i-1; } } int main() { #ifndef ONLINE_JUDGE freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); #endif pre(); int Test, n; scanf("%d", &Test); while(Test--) { scanf("%d", &n); for(int i = 2; i <= 100000; ++i) if(num[i][3] < n) n -= num[i][3]; else {a[3] = i;break;} for(int i = 1; i <= 100000; ++i) if(num[i][2] < n) n -= num[i][2]; else {a[2] = i;break;} for(int i = 0; i <= 100000; ++i) if(num[i][1] < n) n -= num[i][1]; else {a[1] = i;break;} if(a[1] == 0 && a[2] == 1 && a[3] > 2) puts("YES"); else puts("NO"); } #ifndef ONLINE_JUDGE fclose(stdin); fclose(stdout); #endif return 0; }
相关文章推荐
- 必须掌握的第三方框架清单:
- Oracle 10046事件详解
- 《幸福终点站》观后感·
- HAProxy的三种不同类型配置方案
- C#进阶ADO.NET基础一 基本概念、数据库连接操作基础
- 接上一篇博文,继续双机通信问题研究
- Timer与ScheduledThreadPoolExecutor的比较
- java 的exception throw try catch
- Ubuntu下用cue文件对ape和wav文件自动分轨
- 【Linux】进程调度概述
- HTML5另类塔防游戏 -《三国战线》发布
- 投资的原则不是收益能有多大,而是失败了能不能保本
- Json学习笔记
- 【C++缺省函数】 空类默认产生的6个类成员函数
- 索引缓存
- nodejs express 安装需要注意的一些问题
- Mac os Android开发环境搭建-macports、ndk、sdk、Android源码
- centeros7连接wifi
- CentOS-7 安装MySQL5.6.22
- 运算符的重载(复数的相关运算)