【bzoj4002】[JLOI2015]有意义的字符串 数论+矩阵乘法
题目描述
B 君有两个好朋友,他们叫宁宁和冉冉。有一天,冉冉遇到了一个有趣的题目:输入 b;d;n,求
.png)
输入
一行三个整数 b;d;n
输出
一行一个数表示模 7528443412579576937 之后的结果。
样例输入
1 5 9
样例输出
76
提示
其中 0<b^2<=d<(b+1)^2<=10^18,n<=10^18,并且 b mod 2=1,d mod 4=1
题解
数论 高中数学
注意题目中给出的0<b^2<=d<(b+1)^2,这说明了什么?
就是在变相的告诉我们b<=√d<b+1,也就是-1<b-√d<=0,即0<=|b-√d|<1。
那么0<=|b-√d|^n<1,可以看出这个数对整数部分的影响是常数级的。
不妨设
那么an一定恒为整数。
将n=1代入,可知两个±号一定相同,于是只有2种情况
再由通项公式求递推公式,发现只有一种情况符合条件,即:
,通项公式为
根据题目条件b mod 2=1,d mod 4=1可知前面的系数都为整数,于是可以矩阵乘法来推。
推完之后再讨论后一项的影响即可。
ps: n可能等于0,所以需要特判或者从a0开始推。
ps2: 题目中mod较大,需要用到unsigned long long和快速乘
#include <cstdio>
#include <cstring>
#include <algorithm>
#define mod 7528443412579576937ull
using namespace std;
typedef unsigned long long ull;
ull qmul(ull x , ull y)
{
ull ans = 0;
while(y)
{
if(y & 1) ans = (ans + x) % mod;
x = (x + x) % mod;
y >>= 1;
}
return ans;
}
struct matrix
{
int n , m;
ull num[2][2];
matrix()
{
n = m = 0 , memset(num , 0 , sizeof(num));
}
matrix operator*(matrix a)
{
matrix t;
t.n = n , t.m = a.m;
int i , j , k;
for(i = 0 ; i < t.n ; i ++ )
for(j = 0 ; j < t.m ; j ++ )
for(k = 0 ; k < m ; k ++ )
t.num[i][j] = (t.num[i][j] + qmul(num[i][k] , a.num[k][j])) % mod;
return t;
}
}A , B;
matrix qpow(matrix x , ull y)
{
matrix t;
t.n = x.n , t.m = x.m;
int i;
for(i = 0 ; i < x.n ; i ++ )
t.num[i][i] = 1;
while(y)
{
if(y & 1) t = t * x;
x = x * x;
y >>= 1;
}
return t;
}
int main()
{
ull b , d , n , x , y , ans;
scanf("%llu%llu%llu" , &b , &d , &n);
x = b , y = (d - b * b) / 4;
A.n = 1 , A.m = 2 , A.num[0][0] = 2 , A.num[0][1] = b;
B.n = 2 , B.m = 2 , B.num[0][1] = y , B.num[1][0] = 1 , B.num[1][1] = x;
ans = (A * qpow(B , n)).num[0][0];
if(y && n % 2 == 0) ans = (ans + mod - 1) % mod;
printf("%llu\n" , ans);
return 0;
}
【bzoj4002】[JLOI2015]有意义的字符串 数论+矩阵乘法的更多相关文章
- BZOJ_4002_[JLOI2015]有意义的字符串_矩阵乘法
BZOJ_4002_[JLOI2015]有意义的字符串_矩阵乘法 Description B 君有两个好朋友,他们叫宁宁和冉冉.有一天,冉冉遇到了一个有趣的题目:输入 b;d;n,求 Input 一行 ...
- [BZOJ4002][JLOI2015]有意义的字符串-[快速乘法+矩阵乘法]
Description 传送门 Solution 由于这里带了小数,直接计算显然会爆掉,我们要想办法去掉小数. 而由于原题给了暗示:b2<=d<=(b+1)2,我们猜测可以利用$(\fra ...
- BZOJ4002 [JLOI2015]有意义的字符串
据说这两场加起来只要170= =而这是最简单的题目了QAQ 看到$(\frac {b + \sqrt {d} } {2} )^n$,第一反应是共轭根式$(\frac {b - \sqrt {d} } ...
- bzoj4002 [JLOI2015]有意义的字符串 快速幂
Description B 君有两个好朋友,他们叫宁宁和冉冉. 有一天,冉冉遇到了一个有趣的题目:输入 b;d;n,求((b+sqrt(D)/2)^N的整数部分,请输出结果 Mod 752844341 ...
- bzoj4002 [JLOI2015]有意义的字符串 特征根+矩阵快速幂
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4002 题解 神仙题. 根据下面的一个提示: \[ b^2 \leq d \leq (b+1)^ ...
- BZOJ4002 [JLOI2015]有意义的字符串 【数学 + 矩乘】
题目链接 BZOJ4002 题解 容易想到\(\frac{b + \sqrt{d}}{2}\)是二次函数\(x^2 - bx + \frac{b^2 - d}{4} = 0\)的其中一根 那么就有 \ ...
- 【BZOJ4002】[JLOI2015]有意义的字符串(数论,矩阵快速幂)
[BZOJ4002][JLOI2015]有意义的字符串(数论,矩阵快速幂) 题面 BZOJ 洛谷 题解 发现我这种题总是做不动... 令\(A=\frac{b+\sqrt d}{2},B=\frac{ ...
- 【BZOJ4002】[JLOI2015]有意义的字符串 数学
[BZOJ4002][JLOI2015]有意义的字符串 Description B 君有两个好朋友,他们叫宁宁和冉冉.有一天,冉冉遇到了一个有趣的题目:输入 b;d;n,求 Input 一行三个整数 ...
- [JLOI2015]有意义的字符串
4002: [JLOI2015]有意义的字符串 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1000 Solved: 436[Submit][St ...
随机推荐
- springmvc请求数据的流程。
验证了我说的,从model层中拿来的数据,不管什么类型,都是通过隐含模型,中转,放入request中的.除非你特意把这些数据放到session域中 流程含义解释:(来自网友)(1)HTTP请求到达we ...
- 【ntp时间校准配置】
Ntp(网络时间协议)是一种可以通过TCP/IP网络传播,其架构模式可分为C/S(客户端/服务器),PTP(对等),broatcast(广播), mutilbrocast(组播),无论在任何系统或设备 ...
- Linux之redis主从复制
redis集群中的数据库复制就是通过主从同步实现的 主节点Master把数据分发给节点Salve 主从同步的好处在高可用, redis节点有冗余设计 redis主从同步的原理 1. 从服务器向主服务器 ...
- 一道SQL面试题——表行列数据转换(表转置)
SQL语句如下: select country, sum(case when type='A' then money end) as A, sum(case when type='B' then mo ...
- 吐血分享:QQ群霸屏技术教程2017(问题篇)
霸屏技术,问题篇后,暂时搁置,尔望后续. 这里针对操作中,经常遇到的问题,做个简单整理. 回忆下,排名流程. 1.建群,品牌产品群,做任何关键词都是品牌产品群,皆因其有独特的优势. 2.拉人,填充群人 ...
- Python的jieba模块简介
现如今,词云技术遍地都是,分词模块除了jieba也有很多,主要介绍一下jieba的基本使用 import jieba import jieba.posseg as psg from os import ...
- 06 python操作MySQL和redis(进阶)
python操作mysql.redis 阶段一.mysql事务 主要用于处理操作量大,复杂度高的数据.比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息, ...
- python数据类型及其特有方法
一.运算符 in方法 "hello" in "abcdefghijklmnopqrstuvwxyz" "li" in ["gg&q ...
- linux 热替换so文件
http://www.zhaoch.top/操作系统/linux/热替换so文件.html 热替换so文件 www.zhaoch.top > 操作系统 > linux 发现nginx的动态 ...
- linux文件操作篇 (二) 打开和关闭文件
2.1 打开文件和关闭文件 #include <sys/types.h>#include <sys/stat.h>#include <fcntl.h> 头文件 i ...