【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 ...
随机推荐
- 判断Map集合中是否存在某一个key
方法一: Map<String,String> hashmp = ne HashMap(); hashmp.put("aa", "111"); ha ...
- Mit6.824 Lab1-MapReduce
前言 Mit6.824 是我在学习一些分布式系统方面的知识的时候偶然看到的,然后就开始尝试跟课.不得不说,国外的课程难度是真的大,一周的时间居然要学一门 Go 语言,然后还要读论文,进而做MapRed ...
- isolate-user-vlan隔离用户vlan的配置
lab1 根据项目需求搭建好拓扑图: 首先,配置sw2,在E0/4/0接口上创建vlan20,并将该vlan接口配置成带有ip地址的类以太接口 其次,在E0/4/1接口上加入vlan2,同理,E0/4 ...
- Docker(三):部署软件
Docker的镜像文件可以在镜像仓库中进行搜索. 部署软件目录导航: 常用命令 部署 Tomcat 部署 MySQL 部署 Oracle 常用命令 docker的常用命令如下: docker -v , ...
- BC追踪
项目又要开始改造了,记录一下改造过程中碰到的坑和解决思路,避免以后回头看看自己的笔记都不知道写了什么. (一)敏感信息混淆 (二)活用ComponentScan (三)Swagger配置多项目共用 ( ...
- Hadoop(11)-MapReduce概述和简单实操
1.MapReduce的定义 2.MapReduce的优缺点 优点 缺点 3.MapReduce的核心思想 4.MapReduce进程 5.常用数据序列化类型 6.MapReduce的编程规范 用户编 ...
- django开发傻瓜教程-3-celery异步处理
Ref: https://www.jianshu.com/p/6f8576a37a3e https://blog.csdn.net/Demo_3/article/details/78119951 ht ...
- Kubernetes-运维指南
Node隔离与恢复 cat unschedule_node.yaml apiVersion: kind: Node metadata: name: k8s-node-1 labels: kuberne ...
- Educational Codeforces Round 47 (Rated for Div. 2) :C. Annoying Present(等差求和)
题目链接:http://codeforces.com/contest/1009/problem/C 解题心得: 题意就是一个初始全为0长度为n的数列,m此操作,每次给你两个数x.d,你需要在数列中选一 ...
- ubuntu 关闭触控板
第一种: 1 sudo rmmod psmouse 这个是禁用的 2 sudo modprobe psmouse 这个是启用的 这个方法很便捷,但是会将触点和触板都禁用了,一般还是希望保持触点是 ...