博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Happy Necklace(矩阵快速幂)
阅读量:6170 次
发布时间:2019-06-21

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

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

Total Submission(s): 222    Accepted Submission(s): 91

Problem Description

Little Q wants to buy a necklace for his girlfriend. Necklaces are single strings composed of multiple red and blue beads.

Little Q desperately wants to impress his girlfriend, he knows that she will like the necklace only if for every prime length continuous subsequence in the necklace, the number of red beads is not less than the number of blue beads.
Now Little Q wants to buy a necklace with exactly n beads. He wants to know the number of different necklaces that can make his girlfriend happy. Please write a program to help Little Q. Since the answer may be very large, please print the answer modulo 109+7.
Note: The necklace is a single string, {not a circle}.

 

 

Input

The first line of the input contains an integer T(1T10000), denoting the number of test cases.

For each test case, there is a single line containing an integer n(2n1018), denoting the number of beads on the necklace.

 

 

Output

For each test case, print a single line containing a single integer, denoting the answer modulo 109+7.

 

 

Sample Input

2
2
3

 

 

Sample Output

3

4

 

//题意:给出红蓝两种珠子,要做一条长为 n 个珠子的项链,要求对于每一个素数长度的项链,都要使红色大于等于蓝色,问有多少种搭配方法

找出规律后,就知道只是简单的矩阵快速幂了,f[n] = f[n-1] + f[n-3]

 

1 #include 
2 #include
3 #include
4 using namespace std; 5 #define LL long long 6 #define MOD 1000000007 7 struct Mat 8 { 9 LL m[3][3];10 }unit,base;11 LL n;12 13 Mat Mult(Mat a,Mat b)14 {15 Mat re;16 for (int i=0;i<3;i++)17 {18 for (int j=0;j<3;j++)19 {20 re.m[i][j]=0;21 for (int k=0;k<3;k++)22 re.m[i][j]=(re.m[i][j]+ a.m[i][k]*b.m[k][j])%MOD;23 }24 }25 return re;26 }27 28 void Init()29 {30 base.m[0][0]=1,base.m[0][1]=0,base.m[0][2]=1;31 base.m[1][0]=1,base.m[1][1]=0,base.m[1][2]=0;32 base.m[2][0]=0,base.m[2][1]=1,base.m[2][2]=0;33 memset(unit.m,0,sizeof(unit.m));34 for (int i=0;i<3;i++) unit.m[i][i]=1;35 }36 37 LL cal(LL n)38 {39 if (n<4) //n太小的情况40 {41 LL num[4]={
0,2,3,4};42 return num[n];43 }44 Mat s=unit,b=base;45 LL x = n-3;46 while(x)47 {48 if (x&1) s = Mult(s,b);49 b = Mult(b,b);50 x/=2;51 }52 return (s.m[0][0]*4+s.m[0][1]*3+s.m[0][2]*2)%MOD;53 }54 55 int main()56 {57 int T;58 scanf("%d",&T);59 while (T--)60 {61 scanf("%lld",&n);62 Init();63 printf("%lld\n",cal(n));64 }65 return 0;66 }
View Code

 

 

 

 

转载于:https://www.cnblogs.com/haoabcd2010/p/6832663.html

你可能感兴趣的文章
数据库锁和数据库隔离级别
查看>>
Linux下的内核测试工具——perf使用简介
查看>>
《从问题到程序:用Python学编程和计算》——2.3 内置函数和数学函数包
查看>>
《Photoshop修饰与合成专业技法》目录—导读
查看>>
《Metasploit渗透测试手册》—第1章1.10节分析数据库中存储的渗透测试结果
查看>>
《Adobe Acrobat XI经典教程》—第2课减小文件大小
查看>>
《数据库技术原理与应用教程》一第2章 数据库的基础知识
查看>>
QuaggaJS —— 纯 JavaScript 开发的条形码扫描
查看>>
在图片中加入噪点就能骗过 Google 最顶尖的图像识别 AI
查看>>
免费下载!业界首部安卓热修复宝典出炉,阿里技术大牛联袂推荐
查看>>
OpenID 关联认证提供 CoreOS dex
查看>>
《Node.js区块链开发》一2.2 信用,决定着利益转移的方向
查看>>
Speedy:来自京东的 Docker 镜像存储系统
查看>>
《动手玩转Arduino》——11.2 众多的Arduino板
查看>>
IBM Watson 进入癌症基因组分析市场
查看>>
在 Linux 中查看你的时区
查看>>
Linux集群和自动化维1.6 小结
查看>>
《OpenACC并行编程实战》—— 第1章 并行编程概览 1.1 加速器产品
查看>>
C语言OJ项目参考(2417) 字符串长度
查看>>
ajax的手写、封装和自定义设置
查看>>