Sequence

Problem Description
Let us define a sequence as below

f1=A
f2=B
fn=C*fn-2+D*fn-1+[p/n]

Your job is simple, for each task, you should output Fn module 109+7.

 
Input
The first line has only one integer T, indicates the number of tasks.

Then, for the next T lines, each line consists of 6 integers, A , B, C, D, P, n.

1≤T≤200≤A,B,C,D≤1091≤P,n≤109

 
Sample Input
2
3 3 2 1 3 5
3 2 2 2 1 4
 
Sample Output
36
24
 
题意:题目给出ABCDPn,第一项是A,第二项是B,然后还有个递推式,问第n项是多少
 
思路:如果我们按照他的递推式去推得答案的话,n的范围是1e9肯定会超时,但是我们又必须要用到这个式子,我们就想有没有加快的方法,其实做多了题会发现这是矩阵快速幂的形式
矩阵快速幂就是把你原有的递推式再加快执行,
但是 fn=C*fn-2+D*fn-1+[p/n]
其中[p/n]是个会变化的值,我们的矩阵里面不好处理
如果是一个常数C1的话
我们的关系矩阵就可以写为 
fn  D  C  1    fn-1
fn-1=  1   0  0 *    fn-2
C1      0     0  1     C1 
 利用了矩阵乘法
 
然后我们再来讨论[p/n]
[p/n]因为是整除,那么他的一段内的值肯定是相同的
这个我们可以利用数论中的除法分块得出 [p/n]   n属于1-p   他的整除值也只会有 O(sqrt(p))种值
我们对每一块使用矩阵快速幂,那样这个整除数又是常数就可以利用上面这个关系矩阵,由于只有O(sqrt(p))种值,复杂度上也不会有事
所以我们总的解法就是 除法分块+矩阵快速幂
 
除法分块:i-p/(p/i) 这一段是一个块
因为他们的值都是 p/i  ,最小的是i,因为是余数最多的情况,我们利用最基本的除法原理   a/b=c   ->    a/c=b   ,我们把整除值当作除数 ,除出来的自然是下标,又因为是整除,所以
算出来的下标也是余数最小的情况   
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
using namespace std;
const long long mod=1e9+;
struct jz//结构体写法的矩阵快速幂
{
long long num[][];
jz() { memset(num,,sizeof(num)); }
jz operator*(const jz &P)const
{
jz ans;
for(int k=;k<;k++)
for(int i=;i<;i++)
for(int j=;j<;j++)
ans.num[i][j]=(ans.num[i][j]+num[i][k]*P.num[k][j]%mod)%mod;
return ans;
}
}COE,ans,unit;
int T_T;
long long A,B,C,D,P,n;
jz pOw(jz X,long long m)//矩阵快速幂
{
jz ans;
for(ans=unit;m;m>>=,X=X*X)
if(m&)
ans=ans*X;
return ans;
}
void init(long long A,long long B,long long C,long long D,long long x)//更新关系矩阵
{
COE.num[][]=;
COE.num[][]=;
COE.num[][]=;
COE.num[][]=C;
COE.num[][]=D;
COE.num[][]=x; // this element need to be changed each step.
COE.num[][]=;
COE.num[][]=;
COE.num[][]=;
return;
}
int main()
{
for(int i=;i<;i++) unit.num[i][i]=;
scanf("%d",&T_T);
while(T_T--)
{
scanf("%lld%lld%lld%lld%lld%lld",&A,&B,&C,&D,&P,&n);
if(n==) printf("%lld\n",A);
else if(n<P)
{
ans.num[][]=A;
ans.num[][]=B;
ans.num[][]=;
for(long long i=;i<=n;i=P/(P/i)+)//除法分块
{
init(A,B,C,D,P/i);
if(n<=P/(P/i)) COE=pOw(COE,n-i+);
else COE=pOw(COE,P/(P/i)+-i);
ans=COE*ans;
}
printf("%lld\n",ans.num[][]);
}
else if(P<=n)
{
ans.num[][]=A;
ans.num[][]=B;
ans.num[][]=;
for(long long i=;i<=P;i=P/(P/i)+)//除法分块
{
init(A,B,C,D,P/i);
COE=pOw(COE,P/(P/i)+-i);
ans=COE*ans;
}
init(A,B,C,D,);
COE.num[][]=;
COE=pOw(COE,n-max(P,2LL));//多余的一段的整除值都是0
ans=COE*ans;
printf("%lld\n",ans.num[][]);
}
}
fclose(stdin);
fclose(stdout);
return ;
}

杭电多校第七场 1010 Sequence(除法分块+矩阵快速幂)的更多相关文章

  1. 杭电多校第七场-J-Sequence

    题目描述 Let us define a sequence as belowYour job is simple, for each task, you should output Fn module ...

  2. hdu61272017杭电多校第七场1008Hard challenge

    Hard challenge Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others) ...

  3. 2017杭电多校第七场1011Kolakoski

    Kolakoski Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others) Tota ...

  4. 2017杭电多校第七场1005Euler theorem

    Euler theorem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others) ...

  5. 2019杭电多校第七场 HDU - 6656 Kejin Player——概率&&期望

    题意 总共有 $n$ 层楼,在第 $i$ 层花费 $a_i$ 的代价,有 $pi$ 的概率到 $i+1$ 层,否则到 $x_i$($x_i \leq 1$) 层.接下来有 $q$ 次询问,每次询问 $ ...

  6. 【杭电多校第七场】A + B = C

    原题: Given a,b,c, find an arbitrary set of x,y,z such that a*10^x+b*10^y=c*10^z and 0≤x,y,z≤10^6. 给你三 ...

  7. [2019杭电多校第七场][hdu6656]Kejin Player

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6656 题意为从i级花费a元有p的概率升到i+1级,有1-p的概率降到x级(x<i),查询从L级升 ...

  8. [2019杭电多校第七场][hdu6655]Just Repeat

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6655 题意是说两个人都有一些带有颜色的牌,两人轮流出牌,但是不能出对面出过的颜色的牌,最后谁不能出牌谁 ...

  9. [2019杭电多校第七场][hdu6651]Final Exam

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6651 题意:n个科目,总共m分,通过一科需要复习花费科目分数+1分钟,在不知道科目分数的情况下,问最少 ...

随机推荐

  1. 微信小程序发起微信支付

    点击链接查看详情:(支付中配置参数需要从后台得到->签名需要从微信申请才可以得到) https://mp.weixin.qq.com/debug/wxadoc/dev/api/api-pay.h ...

  2. Vasya And The Mushrooms CodeForces - 1016C (前缀和模拟)

    大意: 给定2*n的矩阵, 每个格子有权值, 走到一个格子的贡献为之前走的步数*权值, 每个格子只能走一次, 求走完所有格子最大贡献. 沙茶模拟打了一个小时总算打出来了 #include <io ...

  3. img标签设置默认图片

    为了美观当网页图片不存在时不显示叉叉图片 当在页面显示的时候,万一图片被移动了位置或者丢失的话,将会在页面显示一个带X的图片,很是影响用户的体验.即使使用alt属性给出了”图片XX”的提示信息,也起不 ...

  4. oracle的 表、 procedure、package等对象被锁,处理方法

    1.0  oracle中表被锁,处理方法 select t4.object_name, t3.spid, t1.oracle_username, t1.os_user_name  from v$pro ...

  5. 【LeetCode】字符串匹配

    给定目标串 haystack 和模式串 needle ,返回 needle 在 haystack 中第一次出现的位置下标,若 needle 不是 haystack 的子串则返回 -1. 1. Brut ...

  6. 1.Liunx 文件管理

    文件管理命令 1.基本命令:ls .cd .pwd .man 2.文件操作:touch . cp . rm . mv .ln . mkdir . rmdir 3.文件查看:cat .more .les ...

  7. js如何简单实现汉字转成拼音的功能

    最近项目需要一个功能,实现汉字转拼音功能,具体比如说输入一个“你好”,同时带出对应拼音“NiHao”,在此做一下记录 1.首先引入两个文件 <script src="jquery.mi ...

  8. 01背包问题之2(dp)

    01背包问题之2 有n个物品,重量和价值分别为wi和vi,从这些物品中挑选出重量不超过W的物品,求所有挑选方案中物品价值总和的最大值 限制条件: 1 <= n <= 100; 1 < ...

  9. Win10系列:JavaScript综合实例2

    在项目中添加一个名为pages的文件夹,并在pages文件夹里面再添加一个名为mainPage的文件夹,接着在mainPage文件夹里添加一个"页面控制"项,命名为mainPage ...

  10. SQL优化过程中常见Oracle HINT

    在SQL语句优化过程中,我们经常会用到hint,现总结一下在SQL优化过程中常见Oracle HINT的用法: 1. /*+ALL_ROWS*/ 表明对语句块选择基于开销的优化方法,并获得最佳吞吐量, ...