计蒜客NOIP提高组模拟Day2,Pro1蒜头君的兔子
2017-07-30 21:52
459 查看
https://nanti.jisuanke.com/t/16442
中文题不讲题意。。。
只要看一眼数据范围就知道暴力模拟是肯定不行的,我们就来想一想其他方法。
这题现场也没有满分解法。。。试后得知正解是矩阵乘法,就又跑去复习了一遍矩阵乘法,其实也是很好理解的。
因为一到十岁就会死,所以一共只有十种年龄,把他们都压进一个单列矩阵(单行也行),然后因为一岁的是由零岁转移来,两岁是由一岁转移来,所以把这些所对应的要相乘的矩阵的行列赋成1,还有就是新出生的兔子,这些就是把第一行除了原本零岁的其他所有年龄都赋值成1,因为除了原本零岁的,它都可以被转移来。
肯定是不可以一个一个乘的,所以就快速幂一下,没什么好说的。。。
代码:
中文题不讲题意。。。
只要看一眼数据范围就知道暴力模拟是肯定不行的,我们就来想一想其他方法。
这题现场也没有满分解法。。。试后得知正解是矩阵乘法,就又跑去复习了一遍矩阵乘法,其实也是很好理解的。
因为一到十岁就会死,所以一共只有十种年龄,把他们都压进一个单列矩阵(单行也行),然后因为一岁的是由零岁转移来,两岁是由一岁转移来,所以把这些所对应的要相乘的矩阵的行列赋成1,还有就是新出生的兔子,这些就是把第一行除了原本零岁的其他所有年龄都赋值成1,因为除了原本零岁的,它都可以被转移来。
肯定是不可以一个一个乘的,所以就快速幂一下,没什么好说的。。。
代码:
#include <functional> #include <algorithm> #include <exception> #include <stdexcept> #include <streambuf> #include <iterator> #include <string.h> #include <stdlib.h> #include <typeinfo> #include <valarray> #include <iostream> #include <sstream> #include <istream> #include <stdio.h> #include <climits> #include <clocale> #include <complex> #include <csetjmp> #include <csignal> #include <cstdarg> #include <cstddef> #include <ctype.h> #include <cassert> #include <cstdlib> #include <utility> #include <cstring> #include <numeric> #include <ostream> #include <cwctype> #include <fstream> #include <iomanip> #include <math.h> #include <bitset> #include <cctype> #include <string> #include <vector> #include <limits> #include <locale> #include <memory> #include <cerrno> #include <iosfwd> #include <cfloat> #include <cstdio> #include <cwchar> #include <cmath> #include <ctime> #include <deque> #include <queue> #include <stack> #include <list> #include <ios> #include <map> #include <set> #include <new> #define fi first #define se second #define pb push_back #define ll long long #define pii pair<int,int> using namespace std; const int maxn=15; const ll modn=1e9+7; int n=10,m; struct matrix { ll v[maxn][maxn]; int x,y; void s0(int a,int b) { for(int i=0;i<maxn;i++) for(int j=0;j<maxn;j++) v[i][j]=0; x=a;y=b; } void s1() { s0(n,n); for(int i=0;i<n;i++) v[i][i]=1; } }; matrix mult(matrix a,matrix b) { matrix c; c.s0(a.x,b.y); for(int i=0;i<a.x;i++) { for(int j=0;j<b.y;j++) { for(int k=0;k<a.y;k++) { c.v[i][j]+=a.v[i][k]*b.v[k][j]; c.v[i][j]%=modn; } } } return c; } matrix kissme(matrix a,int ti) { if(ti==0) { matrix c; c.s1(); return c; } if(ti==1) return a; if(ti%2==0) { matrix b=kissme(a,ti/2); return mult(b,b); } else { matrix b=kissme(a,ti/2); return mult(b,mult(b,a)); } } int main() { cin>>m; matrix k; k.s0(n,1); k.v[1][0]=1; matrix ch; ch.s0(n,n); for(int i=1;i<n;i++) { ch.v[0][i]=1; } for(int i=0;i<n-1;i++) { ch.v[i+1][i]=1; } ch=kissme(ch,m-1); k=mult(ch,k); ll ans=0; for(int i=0;i<n;i++) ans+=k.v[i][0]; ans%=modn; cout<<ans<<endl; return 0; }
相关文章推荐
- 【NOIP2016提高A组模拟8.19】(雅礼联考day2)树上路径
- 计蒜客 2017 NOIP 提高组模拟赛(三)Day2 小区划分
- 【NOIP2016提高A组模拟8.19】(雅礼联考day2)公约数
- 【NOIP2016提高A组模拟8.19】(雅礼联考day2)总结
- {小结}NOIP2016提高A组模拟8.19(雅礼联考day2)
- 计蒜客 2017 NOIP 提高组模拟赛(二)Day2
- 闭门造车【NOIP2016提高A组模拟9.10】
- 【JZOJ4790】【NOIP2016提高A组模拟9.21】选数问题
- JZOJ4675. 【NOIP2016提高A组模拟7.21】Double-row
- 【模拟】【NOIP2004提高组】津津的储蓄计划
- 计数【NOIP2016提高A组模拟7.15】
- JZOJ5361. 【NOIP2017提高A组模拟9.14】捕老鼠
- 5368. 【NOIP2017提高A组模拟9.16】为逝去的公主献上的七重樱 单调队列
- 【JZOJ4930】【NOIP2017提高组模拟12.18】C
- JZOJ100042. 【NOIP2017提高A组模拟7.12】保留道路
- 【NOIP2013提高组day2】华容道
- C 【NOIP2017提高组模拟12.18】
- Noip2013提高组day2 花匠
- JZOJ5390. 【NOIP2017提高A组模拟9.26】逗气
- NOIP 2014 提高组 Day2