1085: Water Problem

Time Limit:3000/1000 MS (Java/Others)   Memory Limit:163840/131072 KB (Java/Others)
Total Submissions:1252   Accepted:132

[Submit][Status][Discuss]

Description

函数 f:Z+→Z。已知 f(1),f(2) 的值,且对于任意 x>1x>1,有 f(x+1)=f(x)+f(x−1)+sin(πx/2)。

求 f(n)f(n) 的值。

Input

多组数据。(数据组数 T≤100)

每组数据包含 3 个不超过 10^9 的正整数,分别代表 f(1),f(2)和 n 的值。

Output

输出 f(n)mod(10^9+7)。每组输出末尾有换行符。

Sample Input

1 2 3
1 2 5

Sample Output

3
7 题意很清楚。题目出处:http://dutacm.club:7217/codesheaven/problem.php?id=1085
思路:也是看的题解,之前就是最后的sin解决不了。使用此处sin函数的周期为4,那么每半个周期可以将sin抵消掉。
f(x+1)=f(x)+f(x-1)+sin(πx/2) 1式
f(x-1)=f(x-2)+f(x-3)+sin(π(x-2)/2) 2式
将2式带入1式,得f(x+1)=f(x)+f(x-2)+f(x-3),然后转移矩阵很容易写出。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;
#define MOD 1000000007
#define LL long long int Sin[]= {,,,-};
struct Matrix
{
int row,col;
LL matr[][];
Matrix() {}
Matrix(int r,int c,int num=)
{
row=r;
col=c;
for(int i=; i<=r; i++)
for(int j=; j<=c; j++)
matr[i][j]=num;
}
}; Matrix matr_multi(Matrix m1,Matrix m2) //矩阵乘法
{
Matrix m3(m1.row,m2.col,);
for(int i=; i<=m1.row; i++)
for(int j=; j<=m2.col; j++)
for(int k=; k<=m1.col; k++)
m3.matr[i][j]=(m3.matr[i][j]+m1.matr[i][k]*m2.matr[k][j])%MOD;
return m3;
} void matr_givevalue(Matrix& a,Matrix b)
{
a.row=b.row;
a.col=b.col;
for(int i=; i<=a.row; i++)
for(int j=; j<=a.col; j++)
a.matr[i][j]=b.matr[i][j];
} Matrix matr_pow(Matrix m1,int k) //矩阵快速幂
{
Matrix m2;
matr_givevalue(m2,m1);
k--;
while(k>)
{
if(k&)
m2=matr_multi(m2,m1);
m1=matr_multi(m1,m1);
k>>=;
}
return m2;
} LL PowMod(LL n,int k) //常规快速幂
{
LL res=;
while(k>)
{
if(k&)
res=(res*n)%MOD;
n=(n*n)%MOD;
k>>=;
}
return res;
} void matr_output(Matrix m)
{
for(int i=; i<=m.row; i++)
{
for(int j=; j<=m.col; j++)
cout<<m.matr[i][j]<<" ";
cout<<endl;
}
}
int main()
{
LL f1,f2,n;
while(scanf("%lld%lld%lld",&f1,&f2,&n)!=EOF)
{
Matrix m1(,);
m1.matr[][]=f1;
m1.matr[][]=f2;
m1.matr[][]=(f1+f2+Sin[])%MOD;
m1.matr[][]=(m1.matr[][]+m1.matr[][]+Sin[])%MOD;
Matrix m2(,,);
m2.matr[][]=m2.matr[][]=m2.matr[][]=m2.matr[][]=;
m2.matr[][]=m2.matr[][]=;
if(n>)
{
m2=matr_pow(m2,n-);
m1=matr_multi(m1,m2);
printf("%lld\n",m1.matr[][]);
}
else
{
printf("%lld\n",m1.matr[][-n]);
}
} return ;
}

 

 

dutacm.club_1085_Water Problem_(矩阵快速幂)的更多相关文章

  1. hdu 1757 A Simple Math Problem_矩阵快速幂

    题意:略 简单的矩阵快速幂就行了 #include <iostream> #include <cstdio> #include <cstring> using na ...

  2. dutacm.club Water Problem(矩阵快速幂)

    Water Problem Time Limit:3000/1000 MS (Java/Others)   Memory Limit:163840/131072 KB (Java/Others)Tot ...

  3. 矩阵快速幂 HDU 4565 So Easy!(简单?才怪!)

    题目链接 题意: 思路: 直接拿别人的图,自己写太麻烦了~ 然后就可以用矩阵快速幂套模板求递推式啦~ 另外: 这题想不到或者不会矩阵快速幂,根本没法做,还是2013年长沙邀请赛水题,也是2008年Go ...

  4. 51nod 算法马拉松18 B 非010串 矩阵快速幂

    非010串 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 如果一个01字符串满足不存在010这样的子串,那么称它为非010串. 求长度为n的非010串的个数.(对1e9+7取模) ...

  5. 51nod 1113 矩阵快速幂

    题目链接:51nod 1113 矩阵快速幂 模板题,学习下. #include<cstdio> #include<cmath> #include<cstring> ...

  6. 【66测试20161115】【树】【DP_LIS】【SPFA】【同余最短路】【递推】【矩阵快速幂】

    还有3天,今天考试又崩了.状态还没有调整过来... 第一题:小L的二叉树 勤奋又善于思考的小L接触了信息学竞赛,开始的学习十分顺利.但是,小L对数据结构的掌握实在十分渣渣.所以,小L当时卡在了二叉树. ...

  7. HDU5950(矩阵快速幂)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5950 题意:f(n) = f(n-1) + 2*f(n-2) + n^4,f(1) = a , f(2 ...

  8. 51nod 1126 矩阵快速幂 水

    有一个序列是这样定义的:f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7. 给出A,B和N,求f(n)的值. Input 输 ...

  9. hdu2604(递推,矩阵快速幂)

    题目链接:hdu2604 这题重要的递推公式,找到公式就很easy了(这道题和hdu1757(题解)类似,只是这道题需要自己推公式) 可以直接找规律,推出递推公式,也有另一种找递推公式的方法:(PS: ...

随机推荐

  1. JAVA编程思想(2) - 操作符(二)

    5. 直接常量 -一般来说,假设程序里使用了"直接常量",编译器能够准确的知道要生成什么样的类型.但有时候却是模棱两可的. 这时候须要我们对编译器进行适当的"指导&quo ...

  2. Java实现二叉排序树的插入、查找、删除

    import java.util.Random; /** * 二叉排序树(又称二叉查找树) * (1)能够是一颗空树 * (2)若左子树不空,则左子树上全部的结点的值均小于她的根节点的值 * (3)若 ...

  3. Watcher 实现机制之client注冊

    Zookeeper 提供的了分布式数据的公布/订阅功能,通过 Watch 机制来实现这样的分布式的通知功能. Zookeeper 同意client向server注冊一个Watch监听.当服务端的一些指 ...

  4. [项目机会]使用lync的统一通信平台

    [项目内容]基于微软的lync或者其他思科.腾讯等公司技术,建立一个员工统一的通讯平台,可以随时的保持员工之间沟通. [项目价值] 1.保持项目团队成员之间的随时随地高效的电话或者视频会议: 2.集成 ...

  5. 【uoj35】后缀排序

    后缀数组模板题 #include<algorithm> #include<cstdlib> #include<cstring> #include<cstdio ...

  6. clojure学习记录

    take 从列表中获取子列表 into a b  把b conj 到a中 (defn count-a-seq [lat]  (reduce (fn [x y] (+ x 1)) 0 lat)) red ...

  7. 【bug】【userAgent】极速模式与非极速模式存在差异

    UC浏览器 Android 极速模式 UC浏览器 Android 非极速模式

  8. luogu 3953 逛公园

    noip2017 D1T3 逛公园 某zz选手看到数据范围直接就最短路计数了,结果写错了爆零 题目大意: N个点M条边构成的有向图,且没有自环和重边.其中1号点是起点,N号点是公园的终点,每条边有一个 ...

  9. 6 Workbook 对象

    6.1 在奔跑之前先学会走路:打开和关闭工作薄 代码清单6.1:一个完整的工作薄批处理框架 '代码清单6.1:一个完整的工作薄批处理框架 Sub ProcessFileBatch() Dim nInd ...

  10. python调用java程序--jpype

    官方网站:http://jpype.sourceforge.net/ 官方使用文档:http://jpype.sourceforge.net/doc/user-guide/userguide.html ...