数    位    D    P    开    long    long

首先第一问是转化。

于是就可以二进制下DP了。

第二问是递推,假设最后$n-1$个01位的填法设为$f[i-1]$(方案包括0),于是有fib数列递推关系(很好推),然后矩阵快速幂即可。

一开始思路有点乱,导致边界初始化屡次出错。

WA1:见标题赤字。

WA2:初始化写错了。。。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<cmath>
  6. #define dbg(x) cerr << #x << " = " << x <<endl
  7. using namespace std;
  8. typedef long long ll;
  9. typedef double db;
  10. typedef pair<int,int> pii;
  11. template<typename T>inline T _min(T A,T B){return A<B?A:B;}
  12. template<typename T>inline T _max(T A,T B){return A>B?A:B;}
  13. template<typename T>inline char MIN(T&A,T B){return A>B?(A=B,):;}
  14. template<typename T>inline char MAX(T&A,T B){return A<B?(A=B,):;}
  15. template<typename T>inline void _swap(T&A,T&B){A^=B^=A^=B;}
  16. template<typename T>inline T read(T&x){
  17. x=;int f=;char c;while(!isdigit(c=getchar()))if(c=='-')f=;
  18. while(isdigit(c))x=x*+(c&),c=getchar();return f?x=-x:x;
  19. }
  20. ll f[][];//mistake:long long
  21. int T,b[];
  22. ll n;//mistake:long long
  23. ll dp(int len,int las,int limit){
  24. if(!len)return ;
  25. if(!limit&&~f[len][las])return f[len][las];
  26. int num=limit?b[len]:;ll ret=;
  27. for(register int i=;i<=num;++i)
  28. ret+=las?(i?:dp(len-,,limit&&i==num)):dp(len-,i,limit&&i==num);
  29. return limit?ret:f[len][las]=ret;
  30. }
  31. inline ll task1(ll x){
  32. int len=;while(x)b[++len]=x&,x>>=;
  33. return dp(len,,)-;
  34. }
  35. const int P=1e9+;
  36. struct matrix{
  37. int a[][];
  38. matrix(){a[][]=a[][]=,a[][]=a[][]=;}
  39. inline void build(){a[][]=,a[][]=a[][]=a[][]=;}
  40. inline matrix operator *(const matrix&A)const{
  41. matrix B;
  42. B.a[][]=(a[][]*1ll*A.a[][]+a[][]*1ll*A.a[][])%P;
  43. B.a[][]=(a[][]*1ll*A.a[][]+a[][]*1ll*A.a[][])%P;
  44. B.a[][]=(a[][]*1ll*A.a[][]+a[][]*1ll*A.a[][])%P;
  45. B.a[][]=(a[][]*1ll*A.a[][]+a[][]*1ll*A.a[][])%P;
  46. return B;
  47. }
  48. inline void operator *=(const matrix&A){*this=*this * A;}
  49. };
  50. inline int task2(ll p){
  51. if(p==)return ;
  52. if(p==)return ;
  53. matrix ret,x;x.build();p-=;
  54. for(;p;p>>=,x*=x)if(p&)ret*=x;
  55. return (ret.a[][]*1ll*+ret.a[][]*1ll*)%P;
  56. }
  57.  
  58. int main(){//freopen("test.in","r",stdin);freopen("test.ans","w",stdout);
  59. memset(f,-,sizeof f);
  60. read(T);while(T--)read(n),printf("%lld\n%d\n",task1(n),task2(n));
  61. return ;
  62. }

BZOJ3329 Xorequ[数位DP+递推矩阵快速幂]的更多相关文章

  1. HDU 5950 Recursive sequence 【递推+矩阵快速幂】 (2016ACM/ICPC亚洲区沈阳站)

    Recursive sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Other ...

  2. hdu 2604 递推 矩阵快速幂

    HDU 2604 Queuing (递推+矩阵快速幂) 这位作者讲的不错,可以看看他的 #include <cstdio> #include <iostream> #inclu ...

  3. HDU 2842 (递推+矩阵快速幂)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2842 题目大意:棒子上套环.第i个环能拿下的条件是:第i-1个环在棒子上,前i-2个环不在棒子上.每个 ...

  4. [递推+矩阵快速幂]Codeforces 1117D - Magic Gems

    传送门:Educational Codeforces Round 60 – D   题意: 给定N,M(n <1e18,m <= 100) 一个magic gem可以分裂成M个普通的gem ...

  5. Recursive sequence HDU - 5950 (递推 矩阵快速幂优化)

    题目链接 F[1] = a, F[2] = b, F[i] = 2 * F[i-2] + F[i-1] + i ^ 4, (i >= 3) 现在要求F[N] 类似于斐波那契数列的递推式子吧, 但 ...

  6. HDU6030 Happy Necklace(递推+矩阵快速幂)

    传送门:点我 Little Q wants to buy a necklace for his girlfriend. Necklaces are single strings composed of ...

  7. 五校联考R1 Day1T3 平面图planar(递推 矩阵快速幂)

    题目链接 我们可以把棱柱拆成有\(n\)条高的矩形,尝试递推. 在计算的过程中,第\(i\)列(\(i\neq n\))只与\(i-1\)列有关,称\(i-1\)列的上面/下面为左上/左下,第\(i\ ...

  8. LightOJ 1244 - Tiles 猜递推+矩阵快速幂

    http://www.lightoj.com/volume_showproblem.php?problem=1244 题意:给出六种积木,不能旋转,翻转,问填充2XN的格子有几种方法.\(N < ...

  9. 2017中国大学生程序设计竞赛 - 女生专场 Happy Necklace(递推+矩阵快速幂)

    Happy Necklace Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) ...

随机推荐

  1. Day02:基本IO操作

    IO流 基本IO与OS 按照流的方向主要分为输入流和输出流. 数据流按照数据单位的不同分为字节流和字符流. 按照功能可以划分节点流和处理流. 节点流与处理流 按照流是否直接与特定的地方(如磁盘.内存. ...

  2. rpm操作

    --查找某个软件:abc rpm -qa |grep abc --删除某个软件:abc rpm -e --noscripts  abc

  3. finereport JS 获取按钮所在单元格的值及获取当前报表的变量

    1.通过按钮获取单元格所在的值 debugger; var cr; if(window.lineboxes) { var cells = []; for (var i = 0; i < line ...

  4. C学习笔记-基础数据结构与算法

    数据结构 数据(data)是对客观事物符号表示,在计算机中是指所有能输入的计算机并被计算机程序处理的数据总称. 数据元素(data element)是数据的基本单位,在计算机中通常做为一个整体进行处理 ...

  5. Vim命令使用

    终端输入vim命令(不区分大小写)进入Vim,起始默认进去是normal模式(即普通模式),使用:q可以退出Vim,使用i(insert)进入编辑模式,开始输入文字,使用Esc键又可以回到normal ...

  6. Intellij IDEA中使用Debug调试

    转自:https://blog.csdn.net/zj420964597/article/details/78662299只是为了方便学习技术,少走弯路,如果有异议,请留言,及时处理!!!

  7. 正则爬取某段子网站前20页段子(request库)

    首先还是谷歌浏览器抓包对该网站数据进行分析,结果如下: 该网站地址:http://www.budejie.com/text 该网站数据都是通过html页面进行展示,网站url默认为第一页,http:/ ...

  8. 快速部署单节点RancherServer

    已安装 docker,并配置docker国内镜像源 docker version docker pull rancher/rancher:v2.2.0 docker run -d -p 80:80 - ...

  9. Buy a Ticket CodeForces - 938D (dijkstra)

    大意: n节点无向图, 点$i$到点$j$的花费为$2dis(i,j)+a[j]$, 对于每个点, 求最少花费. 每条边权翻倍, 源点S向所有点$i$连边, 权为$a[i]$, 答案就为$S$到每个点 ...

  10. sql--left join,right join, inner join

    left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录inner join(等值连接) 只 ...