矩阵快速幂。

因为任意素数长度都要满足,所以$3$必须满足,$3$一旦满足,其余的肯定满足,也就是说只要考虑字符串末尾两位即可,$dp$一下就可以算方案数了。$n$较大,可以矩阵加速。

#include <bits/stdc++.h>
using namespace std;
const long long mod=1e9+;
const long long inf=1e18; int T;
long long n; struct Matrix
{
long long A[][];
int R, C;
Matrix operator*(Matrix b);
}; Matrix X, Y, Z; Matrix Matrix::operator*(Matrix b)
{
Matrix c;
memset(c.A, , sizeof(c.A));
int i, j, k;
for (i = ; i <= R; i++)
for (j = ; j <= C; j++)
for (k = ; k <= C; k++)
c.A[i][j] = (c.A[i][j] + (A[i][k] * b.A[k][j])%mod)%mod;
c.R=R; c.C=b.C;
return c;
} void init()
{
n = n - ;
memset(X.A,,sizeof X.A);
memset(Y.A,,sizeof Y.A);
memset(Z.A,,sizeof Z.A); Z.R = ; Z.C = ;
Z.A[][]=; Z.A[][]=; Z.A[][]=; for(int i=;i<=;i++) Y.A[i][i]=; Y.R = ; Y.C = ; X.A[][]=; X.A[][]=; X.A[][]=;
X.A[][]=; X.A[][]=; X.A[][]=;
X.A[][]=; X.A[][]=; X.A[][]=; X.R = ; X.C = ;
} void work()
{
while (n)
{
if (n % == ) Y = Y*X;
n = n >> ;
X = X*X;
}
Z = Z*Y; printf("%lld\n", (Z.A[][]+Z.A[][]+Z.A[][])%mod);
} int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%lld",&n);
init();
work();
}
return ;
}

最新文章

  1. jquery toggle方法使用出错?请看这里-遁地龙卷风
  2. selenium各种场景下的启动Firefox
  3. hdu 2104
  4. C++中把string转成char
  5. open和fopen的区别:
  6. Java 上传下载的
  7. 使用apache进行域名绑定
  8. 用Spring Tools Suite(STS)开始一个RESTful Web Service
  9. balance.go 源码阅读
  10. 编程心法 之 敏捷开发(新架构)Agile Team Organization Squads, Chapters, Tribes and Guilds
  11. The Preliminary Contest for ICPC China Nanchang National Invitational I. Max answer (单调栈+线段树)
  12. 从零开始学安全(十一)●IP地址
  13. Quartz.net入门
  14. bzoj3277 串 (后缀数组+二分答案+ST表)
  15. SD从零开始29-30
  16. ubuntu14.04 忘记了登录密码和root密码
  17. GIT(1)----更新代码和上传代码操作的步骤
  18. PHP-----PHP程序设计基础教程----第一章PHP开篇
  19. Android手机Fiddler真机抓包
  20. ReentrantReadWriteLock (读写锁)源码分析

热门文章

  1. NOIP模拟4
  2. 816C. Karen and Game 贪心
  3. 笔记(二)TabLayout + ViewPager + FragmentPagerAdapter 组合用法
  4. Network File System
  5. Fast File System
  6. hihocoder1415 后缀数组三&#183;重复旋律3
  7. python学习笔记(十四)之字典
  8. SDUT 3917
  9. NYOJ 1063 生活的烦恼 (二叉树)
  10. 全文搜索引擎 Elasticsearch 介绍