【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 ...
随机推荐
- numpy的总结
一:基础篇 1)数值 import numpy as np np.set_printoptions(linewidth=200,suppress=True) a = np.array([1,2,3,4 ...
- dynamic-insert和dynamic-update属性
dynamic-insert 作用:设置对象中没有值的字段 insert并不会对其进行插入. 实体类映射配置如下 <!DOCTYPE hibernate-mapping PUBLIC &quo ...
- 我是一个MySQL小白
我是一个MySQL小白 第一回早起装扮 “mysql,Oracle,SQL-SERVER你们三个 起床没?”,清晨七点多师父喊道. “师父,我(mysql)哪敢睡觉呀,我还在查询表呢,有客户的密码忘记 ...
- C# 隐藏窗口标题栏、隐藏任务栏图标
//没有标题 this.FormBorderStyle = FormBorderStyle.None; //任务栏不显示 this.ShowInTaskbar = false;
- 10-C++远征之模板篇-学习笔记
C++远征之模板篇 将会学到的内容: 模板函数 & 模板类 -> 标准模板类 友元函数 & 友元类 静态数据成员 & 静态成员函数 运算符重载: 一切皆有可能 友元函数 ...
- 003---生成器 & 迭代器
生成器 & 迭代器 列表生成式 现在有个需求,列表[1, 2, 3, 4, 5, 6, 7, 8, 9],将列表里的每个值加1. 二逼青年版 a = [1, 2, 3, 4, 5, 6, 7, ...
- (数据科学学习手札20)主成分分析原理推导&Python自编函数实现
主成分分析(principal component analysis,简称PCA)是一种经典且简单的机器学习算法,其主要目的是用较少的变量去解释原来资料中的大部分变异,期望能将现有的众多相关性很高的变 ...
- The Road to learn React书籍学习笔记(第三章)
The Road to learn React书籍学习笔记(第三章) 代码详情 声明周期方法 通过之前的学习,可以了解到ES6 类组件中的生命周期方法 constructor() 和 render() ...
- C语言 字符数组与字符指针比较
C语言 字符数组与字符指针比较 #include<stdio.h> /* 字符数组会在定以后预先分配内存空间字符串是常量所以会直接把字符串拷贝到数组中, 因为数组地址不同,所以不相等· 字 ...
- python基础之反射、面向对象进阶
isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象,如果是返回True 1 class F ...