【BZOJ3240】【NOI2013】矩阵游戏(数论)

题面

BZOJ

题解

搞什么矩阵十进制快速幂加卡常?

直接数学推导不好吗?

首先观察如何从每一行的第一个推到最后一个

\(f[i]=a·f[i-1]+b\)

利用数列的一系列知识

我们设\(f[i]+x=a(f[i-1]+x)\)

解出\(x=\frac{b}{a-1}\)

所以\(f[m]=a^{m-1}(f[1]+x)-x\)

也就是\(f[m]=a^{m-1}·f[1]+(a^{m-1}-1)x\)

再把它变到下一行去

\(f'[1]=c·f[m]+d\)

\(f'[1]=ca^{m-1}·f[1]+c(a^{m-1}-1)x+d\)

这样子,相当于\(A=ca^{m-1}\),\(B=c(a^{m-1}-1)x+d\)

这样子就是一个重新开始的上面推导的数列了

但是需要注意,当\(a\)和\(A\)为\(1\)的时候需要特殊判断一下

所以就是分类讨论一下就好了

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define ll long long
#define RG register
#define MAX 1000100
#define MOD 1000000007
inline int read()
{
RG int x=0,t=1;RG char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
int n,m,A,B,C,D;
char N[MAX],M[MAX];
int get(char *c,int Mod)
{
int x=0;
for(int i=1,l=strlen(c+1);i<=l;++i)
x=(1ll*x*10+c[i]-48)%Mod;
return x;
}
int fpow(int a,int b)
{
int s=1;
while(b){if(b&1)s=1ll*s*a%MOD;a=1ll*a*a%MOD;b>>=1;}
return s;
}
int n1,n2,m1,m2;
int main()
{
scanf("%s%s",N+1,M+1);
A=read();B=read();C=read();D=read();
int ans=1;
m2=get(M,MOD);m2=(m2+(MOD-1))%MOD;
m1=get(M,MOD-1);m1=(m1+(MOD-2))%(MOD-1);
n1=get(N,MOD-1);n2=get(N,MOD);
if(A!=1)
{
int x=1ll*B*fpow(A-1,MOD-2)%MOD;
B=(1ll*C*(fpow(A,m1)-1+MOD)%MOD*x%MOD+D)%MOD;
A=1ll*C*fpow(A,m1)%MOD;
if(A!=1)
{
int x=1ll*B*fpow(A-1,MOD-2)%MOD;
ans=(1ll*(1+x)*fpow(A,n1))%MOD;
ans=(ans+MOD-x)%MOD;
ans=(ans+MOD-D)*1ll*fpow(C,MOD-2)%MOD;
printf("%d\n",ans);
return 0;
}
else
{
ans=(ans+1ll*B*n1)%MOD;
ans=(ans+MOD-D)*1ll*fpow(C,MOD-2)%MOD;
printf("%d\n",ans);
return 0;
}
}
else
{
A=C;B=(1ll*m2*B%MOD*C%MOD+D)%MOD;
if(A!=1)
{
int x=1ll*B*fpow(A-1,MOD-2)%MOD;
ans=(1ll*(1+x)*fpow(A,n1))%MOD;
ans=(ans+MOD-x)%MOD;
ans=(ans+MOD-D)*1ll*fpow(C,MOD-2)%MOD;
printf("%d\n",ans);
return 0;
}
else
{
ans=(ans+1ll*B*n2)%MOD;
ans=(ans+MOD-D)*1ll*fpow(C,MOD-2)%MOD;
printf("%d\n",ans);
return 0;
}
}
printf("%d\n",ans);
return 0;
}

【BZOJ3240】【NOI2013】矩阵游戏(数论)的更多相关文章

  1. BZOJ3240 NOI2013矩阵游戏(数论)

    必修五题. // luogu-judger-enable-o2 #include<iostream> #include<cstdio> #include<cmath> ...

  2. BZOJ3240 [Noi2013]矩阵游戏

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...

  3. BZOJ3240 [Noi2013]矩阵游戏 矩阵 快速幂 卡常

    原文链接http://www.cnblogs.com/zhouzhendong/p/8084891.html 题目传送门 - BZOJ3240 题意概括 F[1][1]=1F[i,j]=a*F[i][ ...

  4. 题解【bzoj3240 [NOI2013]矩阵游戏】

    挖坑2333 等我把代码写完了再写

  5. bzoj3240 [Noi2013]矩阵游戏——费马小定理+推式子

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3240 n 和 m 太过巨大,不难想到应该用费马小定理什么的来缩小范围: 总之就是推式子啦,看 ...

  6. bzoj 3240: [Noi2013]矩阵游戏 矩阵乘法+十进制快速幂+常数优化

    3240: [Noi2013]矩阵游戏 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 613  Solved: 256[Submit][Status] ...

  7. BZOJ 3240: [Noi2013]矩阵游戏

    3240: [Noi2013]矩阵游戏 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1586  Solved: 698[Submit][Status ...

  8. BZOJ 3240([Noi2013]矩阵游戏-费马小定理【矩阵推论】-%*s-快速读入)

    3240: [Noi2013]矩阵游戏 Time Limit: 10 Sec   Memory Limit: 256 MB Submit: 123   Solved: 73 [ Submit][ St ...

  9. (十进制高速幂+矩阵优化)BZOJ 3240 3240: [Noi2013]矩阵游戏

    题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=3240 3240: [Noi2013]矩阵游戏 Time Limit: 10 Sec  M ...

  10. P1397 [NOI2013]矩阵游戏(递推)

    P1397 [NOI2013]矩阵游戏 一波化式子,$f[1][m]=a^{m-1}+b\sum_{i=0}^{m-2}a^i$,用快速幂+逆元求等比数列可以做到$logm$ 设$v=a^{m-1}, ...

随机推荐

  1. imageNamed和imageWithContextOfFile的区别?哪个性能高

    imageNamed性能高 1.用imageNamed的方式加载时,图片使用完毕后缓存到内存中,内存消耗多,加载速度快.即使生成的对象被 autoReleasePool释放了,这份缓存也不释放,如果图 ...

  2. 程序员的冷笑话 python版本

    在伯乐在线上看到了个冷笑话,感觉很有意思. void tellStory() { printf("从前有座山\n"); printf("山上有座庙\n"); p ...

  3. adb获取设备的序列号

    用数据线连接手机, 打开开发者模式, 并赋予相关权限, 在CMD命令行输入: adb devices 第一个参数即为设备的序列号, 第二个参数device表示设备的状态是在线.

  4. 第六模块:WEB框架开发 第1章·Django框架开发88~128

    88-Ajax简介 89-Ajax的简单实现 90-基于Ajax的传递数据 91-基于Ajax的登录验证 92-基于Form表单的文件上传 93-请求头之contentType 94-Ajax传递js ...

  5. ConfigHelpers

    --默认值可以不传 local ConfigHelpers = {} --设置物体高亮 target:设置对象 isLigth:是否高亮 seeThrough:是否穿透(默认为true,穿透) sta ...

  6. Linux中常用Shell命令

    本随笔文章,由个人博客(鸟不拉屎)转移至博客园 写于:2018 年 05 月 04 日 原地址:https://niaobulashi.com/archives/linux-shell.html -- ...

  7. python内建模块Collections

    # -*- coding:utf-8 -*- # OrderedDict可以实现一个FIFO(先进先出)的dict, # 当容量超出限制时,先删除最早添加的Key: from collections ...

  8. nginx 应用篇

    nginx 信号控制(commanLine) kill singel  pid ps aux|grep nginx nginx 有两个进程,一个 master 一个worker 一个master管理一 ...

  9. Thunder团队第三周 - Scrum会议1

    Scrum会议1 小组名称:Thunder 项目名称:i阅app Scrum Master:王航 工作照片: 杨梓瑞在拍照,所以不在照片中. 参会成员: 王航(Master):http://www.c ...

  10. Calculation PartⅡ

    GitHub/object-oriented 误删内容--周末修复