数    位    D    P    开    long    long

首先第一问是转化。

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

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

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

WA1:见标题赤字。

WA2:初始化写错了。。。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define dbg(x) cerr << #x << " = " << x <<endl
using namespace std;
typedef long long ll;
typedef double db;
typedef pair<int,int> pii;
template<typename T>inline T _min(T A,T B){return A<B?A:B;}
template<typename T>inline T _max(T A,T B){return A>B?A:B;}
template<typename T>inline char MIN(T&A,T B){return A>B?(A=B,):;}
template<typename T>inline char MAX(T&A,T B){return A<B?(A=B,):;}
template<typename T>inline void _swap(T&A,T&B){A^=B^=A^=B;}
template<typename T>inline T read(T&x){
x=;int f=;char c;while(!isdigit(c=getchar()))if(c=='-')f=;
while(isdigit(c))x=x*+(c&),c=getchar();return f?x=-x:x;
}
ll f[][];//mistake:long long
int T,b[];
ll n;//mistake:long long
ll dp(int len,int las,int limit){
if(!len)return ;
if(!limit&&~f[len][las])return f[len][las];
int num=limit?b[len]:;ll ret=;
for(register int i=;i<=num;++i)
ret+=las?(i?:dp(len-,,limit&&i==num)):dp(len-,i,limit&&i==num);
return limit?ret:f[len][las]=ret;
}
inline ll task1(ll x){
int len=;while(x)b[++len]=x&,x>>=;
return dp(len,,)-;
}
const int P=1e9+;
struct matrix{
int a[][];
matrix(){a[][]=a[][]=,a[][]=a[][]=;}
inline void build(){a[][]=,a[][]=a[][]=a[][]=;}
inline matrix operator *(const matrix&A)const{
matrix B;
B.a[][]=(a[][]*1ll*A.a[][]+a[][]*1ll*A.a[][])%P;
B.a[][]=(a[][]*1ll*A.a[][]+a[][]*1ll*A.a[][])%P;
B.a[][]=(a[][]*1ll*A.a[][]+a[][]*1ll*A.a[][])%P;
B.a[][]=(a[][]*1ll*A.a[][]+a[][]*1ll*A.a[][])%P;
return B;
}
inline void operator *=(const matrix&A){*this=*this * A;}
};
inline int task2(ll p){
if(p==)return ;
if(p==)return ;
matrix ret,x;x.build();p-=;
for(;p;p>>=,x*=x)if(p&)ret*=x;
return (ret.a[][]*1ll*+ret.a[][]*1ll*)%P;
} int main(){//freopen("test.in","r",stdin);freopen("test.ans","w",stdout);
memset(f,-,sizeof f);
read(T);while(T--)read(n),printf("%lld\n%d\n",task1(n),task2(n));
return ;
}

最新文章

  1. 如何在一个页面上让多个jQuery
  2. C# 鼠标悬停在datagridview的某单元格,显示悬浮框效果
  3. 基于GPL329xx linux平台电容屏gsl1680的驱动调试分析
  4. 【转载】分享下多年积累的对JAVA程序员成长之路的总结
  5. Django ORM 中的批量操作
  6. IP隧道基础研究
  7. .Net程序员学习Linux(二)
  8. android升级软件版本号,您安装后的新版本号,成功安装画面没有出现,或直接回到桌面
  9. Activiti----hellowWorld(使用H2数据库)
  10. java 图片处理 base64编码和图片二进制编码相互转换
  11. 20155324《网络对抗》Exp1 PC平台逆向破解(5)M
  12. [angularjs] AngularJs 知识回顾
  13. WEB 前端开发插件整理
  14. Linux: Linux C 获取当前系统时间的时间戳(精确到秒、毫秒、微秒) gettimeofday
  15. ABP框架系列之三十八:(NHibernate-Integration-NHibernate-集成)
  16. Redis基础认识及常用命令使用(一)--转载
  17. poj--1088--DFS(记忆化搜索之经典)
  18. Java设置PPT的扇形图,与内嵌Excel联动
  19. mybatis 参数为String,用_parameter 取值
  20. 安装hue-3.11.0

热门文章

  1. 【HANA系列】SAP HANA中null变成问号的问题
  2. WEB框架初识
  3. PJzhang:shell基础入门的2个疗程-one
  4. 安卓的一些UI美化框架的使用
  5. 【机器学习】Learning to Rank 简介
  6. 【VS开发】获得devcon.exe
  7. 【linux杂谈】遇到REMOTE HOST IDENTIFICATION HAS CHANGED怎么办?
  8. [Python3] 039 语法调试
  9. [转帖]FreeBSD、OpenBSD、NetBSD的区别
  10. EM 算法(二)-KMeans