【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. 三年同行,质造未来,腾讯WeTest五大服务免费体验

    WeTest 导读 2018年10月26日,腾讯WeTest将正式迎来三周岁生日.三周年庆典期间,只要在WeTest平台注册的用户,均可免费体验标准兼容.云真机.压测大师.手游安全扫描.应用安全扫描等 ...

  2. PLSQL集合类型

    PLSQL集合类型   --联合数组(索引表) /* 用于存储某个数据类型的数据集合类型 .通过索引获得联合数组中得值 如下例子: */ DECLARE CURSOR cur_chars IS SEL ...

  3. web自动化测试框架总结

    web自动化测试框架总结: https://www.processon.com/mindmap/5bdab924e4b0878bf41e9e09

  4. selenium(Java)WebDriverWait等待机制

    //标题是不是“百度一下,你就知道” 18 new WebDriverWait(driver,5).until(ExpectedConditions.titleIs("百度一下,你就知道&q ...

  5. Zookeeper 分布式应用

    简介 这篇文章是旨在为那些想要利用zookeeper协调服务能力进行分布式应用创建的开发者的入门指导,包括一些理论性和实践性的内容. 文章的前四部分系统的介绍了zookeeper的相关概念,对于理解z ...

  6. 【label】标签组件说明

    label标签组件 用来改进表单组件的可用性,使用for属性找到对应的id,或者将控件放在该标签下,当点击时,就会触发对应的控件.目前可以绑定的控件有:<button/>, <che ...

  7. lintcode 二叉树前序遍历

    二叉树的前序遍历    给出一棵二叉树,返回其节点值的前序遍历. 您在真实的面试中是否遇到过这个题? Yes 样例 给出一棵二叉树 {1,#,2,3}, 1 \ 2 / 3 返回 [1,2,3]. / ...

  8. Android开发-API指南-<activity>

    <activity> 英文原文:http://developer.android.com/guide/topics/manifest/activity-element.html 采集(更新 ...

  9. python3对接聊天机器人API

    详情见http://api.qingyunke.com/智能机器人API接口说明支持功能:天气.翻译.藏头诗.笑话.歌词.计算.域名信息/备案/收录查询.IP查询.手机号码归属.人工智能聊天接口地址: ...

  10. 从零开始的Python学习Episode 6——字符串操作

    字符串操作 一.输出重复字符串 print('smile'*6) #输出6个smile 二.通过引索输出部分字符串 print('smile'[1:]) print('smile'[1:3]) #输出 ...