题目:http://acm.hdu.edu.cn/showproblem.php?pid=6030

题意:给出红蓝两种,然后排成一个字符串,要求在每一个长度为素数的区间里面是的r(red)的数量不小与b(blue)的数量;

解法:难点在于如何找规律。容易推知只要长度为2或3的字符串满足r>=b,那么之后的素数(5、7......)都会满足r>=b。

假设现在有一个n字符的串,其方案数为f(n),考虑一下能否从f(n-1)推得f(n)?

情况1.如果这个串最后一个字符是r,那么倒数第二个既可以是r也可以是b。所以此时f(n) = f(n-1).

情况2.如果这个串最后一个字符是b,那么倒数第二个一定是r才可以满足“长度为2且r>=b”的条件,那么倒数第三个就一定是r,否则不满足“长度为3且r>=b”的条件。所以此时f(n) = f(n-3)

综上,可得f(n) = f(n-1) + f(n-3).

由于输入量巨大(1018),所以用数组储存递推结果是不可行的,而每次递推又太慢,所以只能用矩阵快速幂来解决。

由于递推式中出现f(n-3),所以传递矩阵一定是3*3的。

经过推导可得传递矩阵为

1 1 0

0 0 1

1 0 0

AC:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
using namespace std;
typedef long long ll;
const ll m = 1000000000+7;
const int N = 4;
struct mar
{ll a[N][N];
};//结构化矩阵

mar mul(mar x,mar y)
{mar temp;for(int i = 1 ; i < N ; i++)for(int j = 1 ; j < N ; j++)temp.a[i][j] = 0;for(int i = 1 ; i < N ; i++)for(int j = 1 ; j < N ; j++)for(int k = 1 ; k < N ; k++)temp.a[i][j] += (x.a[i][k]%m*y.a[k][j]%m)%m;return temp;
}//矩阵乘法

mar quickpow(mar a,ll n)
{mar res;res.a[1][1] = 1; res.a[1][2] = 0; res.a[1][3] = 0;res.a[2][1] = 0; res.a[2][2] = 1; res.a[2][3] = 0;res.a[3][1] = 0; res.a[3][2] = 0; res.a[3][3] = 1;//初始化为单位矩阵while(n){if(n&1) res = mul(res,a);a = mul(a,a);n>>=1;}return res;
}//矩阵快速幂核心代码int main()
{int t;ll n;cin >> t;while(t--){cin >> n;if(n==2) {cout << 3 <<endl;continue;}mar A;A.a[1][1] = 1; A.a[1][2] = 0; A.a[1][3] = 1;A.a[2][1] = 1; A.a[2][2] = 0; A.a[2][3] = 0;A.a[3][1] = 0; A.a[3][2] = 1; A.a[3][3] = 0;//构造传递矩阵mar res = quickpow(A,n-2);cout <<  ((res.a[1][1] + res.a[1][2] + res.a[1][3]) % m+ (res.a[2][1] + res.a[2][2] + res.a[2][3]) % m+(res.a[3][1] + res.a[3][2] + res.a[3][3]) % m)%m <<endl;}return 0;
}

转载于:https://www.cnblogs.com/zz990728/p/8886380.html

HDU 6030 Happy Necklace相关推荐

  1. 2017CCPC女生赛 hdu 6030 Happy Necklace

    题目链接 分析: 一道推公式的题目.看着这个范围就感觉是矩阵快速幂. 首先,可以把连续的素数中这个要求简化成连续两个和三个中的要求,很容易想. 定义:a[i],b[i]a[i],b[i]分别表示长度为 ...

  2. HDU 5730 Shell Necklace

    HDU 5730 Shell Necklace 原题连接: http://acm.hdu.edu.cn/showproblem.php?pid=5730 闻题而来. 设组合成长度为 k k的方案数量为 ...

  3. hdu 5730 Shell Necklace——多项式求逆+拆系数FFT

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5730 可以用分治FFT.但自己只写了多项式求逆. 和COGS2259几乎很像.设A(x),指数是长度,系数 ...

  4. HDU 5730 Shell Necklace(生成函数 多项式求逆)

    Shell Necklace 由题意可得f[n]=∑i=1na[i]f[n−i]f[n] = \sum\limits_{i = 1} ^{n} a[i] f[n - i]f[n]=i=1∑n​a[i] ...

  5. HDU 2660 Accepted Necklace

    编辑器加载中... 转载于:https://www.cnblogs.com/bo-tao/archive/2012/02/29/2374602.html

  6. HDU 5730——Shell Necklace

    题意: 一段长为i的项链有a[i]中装饰方法,问长度为n的项链有多少种装饰方式. 思路: 容易推出,dp[i]=∑dp[j]*a[i-j],(1<=j<=i-1)那么这样就刚好符合卷积的运 ...

  7. (step4.3.6)hdu 2660(Accepted Necklace)

    题目大意:输入三个整数t,n,k,分别表示测试用例数.宝石的种类数以及母亲所能接受的最大的重量.接下来的n行,每行有2个整数,分别表示每种宝石的价值及重量. 最后一行为母亲所能接受的保湿的最大重量 解 ...

  8. Fast Fourier Transform

    写在前面的.. 感觉自己是应该学点新东西了.. 所以就挖个大坑,去学FFT了.. FFT是个啥? 坑已补上.. 推荐去看黑书<算法导论>,讲的很详细 例题选讲 1.UOJ #34. 多项式 ...

  9. HDU 5727 Necklace

    题目:Necklace 链接:http://acm.hdu.edu.cn/showproblem.php?pid=5727 题意:要用n个阳石和n个阴石来串一个项链(环状),规定阳石旁边只能是阴石,阴 ...

最新文章

  1. 利用PHP的Popen实现RRDTOOL作图的动态输出
  2. 【控制】蚁群算法(ACO,Ant Colony Optimization)及 Matlab 实现
  3. Quartz-Job 详解
  4. DHL:jQuery框架学习使用总结,插件,继续中...
  5. 修改模板文件后,Build Project(ctrl+F9)可以快速运行
  6. python 一组数据 正态分布散点图_python高维数据型图表矩阵散点图
  7. Expression Blend学习5控件
  8. java.lang.ClassNotFoundException: com.google.wireless.android.sdk.stats.IntellijIndexingStats$Index
  9. 使用微信机器人实现华为OLT和中兴OLT挂测的简单功能
  10. mysql升更新命令_MySQL升级的3种方法
  11. Pandas中DataFrame数据的常用操作(创建、转置、查询、排序、缺失、运算、合并、追加、修改、分组、压缩等)
  12. python snap7开发手册_python-snap7开发笔记
  13. 解决:启动springboot项目,Unable to start web server; nested exception is org.springframework.beans.factory
  14. jQWidgets Crack 用于响应式 Web 开发
  15. 关于Xray中代理的一些总结
  16. 免费的云服务器推荐,你会选择哪一款
  17. C#练习题答案: 反恐精英系列【难度:1级】--景越C#经典编程题库,1000道C#基础练习题等你来挑战
  18. CAN(Controller Area Network)网络通信简介
  19. java.applet.Applet类
  20. 无穷级数的简单求解方法——高等数学

热门文章

  1. Java if语句深度解析
  2. SpringBoot集成JPA
  3. 【转】如何修改Chrome缓存目录的地址
  4. iOS 修改UITabBar的默认点击行为
  5. 手把手教你从零构建属于自己的小linux
  6. [代码]HDU 4335 What is N?
  7. MYSQL 实时升级
  8. MONGODB 集群 配置及 客户端PHP 连接
  9. android studio 新建函数注释模板
  10. protobuf的安装和卸载