CodeForces - 185A Plant
2016-03-31 23:52
337 查看
Description
Dwarfs have planted a very interesting plant, which is a triangle directed "upwards". This plant has an amusing feature. After one year a triangle plant directed "upwards" divides into four triangle plants: three of them will point "upwards" and one will
point "downwards". After another year, each triangle plant divides into four triangle plants: three of them will be directed in the same direction as the parent plant, and one of them will be directed in the opposite direction. Then each year the process repeats.
The figure below illustrates this process.
Help the dwarfs find out how many triangle plants that point "upwards" will be in n years.
Input
The first line contains a single integer n(0 ≤ n ≤ 1018) — the number of full years when the plant
grew.
Please do not use the %lld specifier to read or write 64-bit integers in С++. It is preferred to use cin, cout streams or the %I64d specifier.
Output
Print a single integer — the remainder of dividing the number of plants that will point "upwards" in n years by 1000000007(109 + 7).
Sample Input
Input
Output
Input
Output
Hint
The first test sample corresponds to the second triangle on the figure in the statement. The second test sample corresponds to the third one.
Source
Codeforces Round #118 (Div. 1)
思路:矩阵快速幂
第n年的upwards的数量我们可以看成Xn,downwards的数量可以看成Yn,
那么有
X0=1, Y0=0
X1=3*X0+Y0, Y1=X0+3*Y0
.......
于是就有
Xn=3*X(n-1)+Y(n-1)
Yn=X(n-1)+3*Y(n-1)
那么接下来看矩阵如何操作
利用矩阵的特性:
X Y 3 1 3*X+Y X+3*Y
* =
Y X 1 3 X+3*Y 3*X+Y
正好满足我们上面的递推公式,说明我们的矩阵构造成功了
AC代码:
Dwarfs have planted a very interesting plant, which is a triangle directed "upwards". This plant has an amusing feature. After one year a triangle plant directed "upwards" divides into four triangle plants: three of them will point "upwards" and one will
point "downwards". After another year, each triangle plant divides into four triangle plants: three of them will be directed in the same direction as the parent plant, and one of them will be directed in the opposite direction. Then each year the process repeats.
The figure below illustrates this process.
Help the dwarfs find out how many triangle plants that point "upwards" will be in n years.
Input
The first line contains a single integer n(0 ≤ n ≤ 1018) — the number of full years when the plant
grew.
Please do not use the %lld specifier to read or write 64-bit integers in С++. It is preferred to use cin, cout streams or the %I64d specifier.
Output
Print a single integer — the remainder of dividing the number of plants that will point "upwards" in n years by 1000000007(109 + 7).
Sample Input
Input
1
Output
3
Input
2
Output
10
Hint
The first test sample corresponds to the second triangle on the figure in the statement. The second test sample corresponds to the third one.
Source
Codeforces Round #118 (Div. 1)
思路:矩阵快速幂
第n年的upwards的数量我们可以看成Xn,downwards的数量可以看成Yn,
那么有
X0=1, Y0=0
X1=3*X0+Y0, Y1=X0+3*Y0
.......
于是就有
Xn=3*X(n-1)+Y(n-1)
Yn=X(n-1)+3*Y(n-1)
那么接下来看矩阵如何操作
利用矩阵的特性:
X Y 3 1 3*X+Y X+3*Y
* =
Y X 1 3 X+3*Y 3*X+Y
正好满足我们上面的递推公式,说明我们的矩阵构造成功了
AC代码:
#include<iostream> #include<string.h> using namespace std; typedef long long LL; const LL N = 2; const LL M = 1e9+7; struct mat { LL a[2][2]; }; mat mul(mat a,mat b) { mat c; memset(c.a,0,sizeof(c.a)); for(int i=0;i<N;i++) for(int j=0;j<N;j++) for(int k=0;k<N;++k) { c.a[i][j]+=(a.a[i][k]*b.a[k][j])%M; c.a[i][j]%=M; } return c; } mat quick(mat a,LL n) { mat b; b.a[0][0]=b.a[1][1]=1; b.a[0][1]=b.a[1][0]=0; while(n>0) { if(n&1)b=mul(a,b); a=mul(a,a); n>>=1; } return b; } int main() { LL n; while(cin>>n) { mat a; a.a[0][0]=a.a[1][1]=3; a.a[1][0]=a.a[0][1]=1; a=quick(a,n); cout<<a.a[0][0]<<endl; } return 0; }
相关文章推荐
- 3月学习小结
- 神经网络凸优化
- 学以致用
- Android-全屏动画
- 机器学习技法课之Aggregation模型
- CodeForces 632E Thief in a Shop(DP|完全背包)
- [BZOJ1015][JSOI2008]星球大战starwar(并查集)
- Struts2 转换器 和 拦截器
- 圆形波导
- HDU 5651 xiaoxin juju needs help (组合数)
- 读取Android sd卡的文件
- 2016年3月31日渗透学习总结
- Eclipse环境下配置spket中ExtJS提示(针对无提示和提示错误)
- 实现无锁的栈与队列
- 【C++ Primer plus】【第九章】内存模型和名称空间
- 08-maven同时下载源码
- 把自己电脑变成FTP服务器~~
- JavaCV读写包含中文路径的图片
- android获取外置SD卡的路径
- [BZOJ2461][BeiJing2011]符环(记忆化搜索)