HDU 6030 Happy Necklace
题目: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相关推荐
- 2017CCPC女生赛 hdu 6030 Happy Necklace
题目链接 分析: 一道推公式的题目.看着这个范围就感觉是矩阵快速幂. 首先,可以把连续的素数中这个要求简化成连续两个和三个中的要求,很容易想. 定义:a[i],b[i]a[i],b[i]分别表示长度为 ...
- HDU 5730 Shell Necklace
HDU 5730 Shell Necklace 原题连接: http://acm.hdu.edu.cn/showproblem.php?pid=5730 闻题而来. 设组合成长度为 k k的方案数量为 ...
- hdu 5730 Shell Necklace——多项式求逆+拆系数FFT
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5730 可以用分治FFT.但自己只写了多项式求逆. 和COGS2259几乎很像.设A(x),指数是长度,系数 ...
- 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∑na[i] ...
- HDU 2660 Accepted Necklace
编辑器加载中... 转载于:https://www.cnblogs.com/bo-tao/archive/2012/02/29/2374602.html
- HDU 5730——Shell Necklace
题意: 一段长为i的项链有a[i]中装饰方法,问长度为n的项链有多少种装饰方式. 思路: 容易推出,dp[i]=∑dp[j]*a[i-j],(1<=j<=i-1)那么这样就刚好符合卷积的运 ...
- (step4.3.6)hdu 2660(Accepted Necklace)
题目大意:输入三个整数t,n,k,分别表示测试用例数.宝石的种类数以及母亲所能接受的最大的重量.接下来的n行,每行有2个整数,分别表示每种宝石的价值及重量. 最后一行为母亲所能接受的保湿的最大重量 解 ...
- Fast Fourier Transform
写在前面的.. 感觉自己是应该学点新东西了.. 所以就挖个大坑,去学FFT了.. FFT是个啥? 坑已补上.. 推荐去看黑书<算法导论>,讲的很详细 例题选讲 1.UOJ #34. 多项式 ...
- HDU 5727 Necklace
题目:Necklace 链接:http://acm.hdu.edu.cn/showproblem.php?pid=5727 题意:要用n个阳石和n个阴石来串一个项链(环状),规定阳石旁边只能是阴石,阴 ...
最新文章
- 利用PHP的Popen实现RRDTOOL作图的动态输出
- 【控制】蚁群算法(ACO,Ant Colony Optimization)及 Matlab 实现
- Quartz-Job 详解
- DHL:jQuery框架学习使用总结,插件,继续中...
- 修改模板文件后,Build Project(ctrl+F9)可以快速运行
- python 一组数据 正态分布散点图_python高维数据型图表矩阵散点图
- Expression Blend学习5控件
- java.lang.ClassNotFoundException: com.google.wireless.android.sdk.stats.IntellijIndexingStats$Index
- 使用微信机器人实现华为OLT和中兴OLT挂测的简单功能
- mysql升更新命令_MySQL升级的3种方法
- Pandas中DataFrame数据的常用操作(创建、转置、查询、排序、缺失、运算、合并、追加、修改、分组、压缩等)
- python snap7开发手册_python-snap7开发笔记
- 解决:启动springboot项目,Unable to start web server; nested exception is org.springframework.beans.factory
- jQWidgets Crack 用于响应式 Web 开发
- 关于Xray中代理的一些总结
- 免费的云服务器推荐,你会选择哪一款
- C#练习题答案: 反恐精英系列【难度:1级】--景越C#经典编程题库,1000道C#基础练习题等你来挑战
- CAN(Controller Area Network)网络通信简介
- java.applet.Applet类
- 无穷级数的简单求解方法——高等数学