首页 > 其他分享 >[JLOI2015] 有意义的字符串 题解

[JLOI2015] 有意义的字符串 题解

时间:2024-10-13 21:59:33浏览次数:7  
标签:JLOI2015 frac matrix int 题解 ll 字符串 now sum

看到这个 \(7\times 10^{18}\) 的模数已经可以摆烂了。

不是,你告诉我这东西跟矩阵快速幂优化 DP 有关系??

观察到这个题显然不能硬做,因为你显然不能直接算小数部分,而且还有个取模很难受。

所以我们希望把一切的计算都基于整数。

这个时候我们就要思考,有什么东西可以把根号转化为整数。

直接平方再开方显然是不行的,因为你没办法开方取模。

于是,很神奇的东西出现了,你发现这个东西很像求根公式。

即方程 \(x^2-b\times x+\frac{b^2-d}{4}=0\) 的两个根分别为 \(\frac{b+\sqrt d}{2}\), \(\frac{b-\sqrt d}{2}\)。

这个东西显然可以拿来降幂,即 \(x^n=b\times x^{n-1}+\frac{d-b^2}{4}\times x^{n-2}\)。

所以你就可以直接通过矩阵快速幂求得 \(x^n=a\times x^0+b\times x^1\) 的 \(a,b\)。但是有个问题是 \(x^1\) 并不是整数,而前面还有个取了模的系数 \(b\) 完全没办法向下取整。

发现一个有趣的事实是,对于这个方程的两个根,他们的和为 \(b\)。

故我们考虑对于 \(f_n=(\frac{b+\sqrt d}{2})^n+(\frac{b-\sqrt d}{2})^n\) 进行降幂,即 \(f_i=b\times f_{i-1}+\frac{d-b^2}{4}\times f_{i-2}\),然后有 \(f_0=2,f_1=b\)。可以轻松求得 \(f_n\)。

另外一个有趣的事实是这个奇怪的数据范围 \(b^2\le d \le (b+1)^2\)。可以发现,当 \(n\) 为偶数,有 \(0\le (\frac{b-\sqrt d}{2})^n \le 1\),否则为奇数时,有 \(-1\le (\frac{b-\sqrt d}{2})^n \le 0\)。用人话说就是当 \(n\) 为偶数并且 \(b^2\not=d\) 时,答案就是 \(f_n-1\),否则就是 \(f_n\)。

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const ll mod = 7528443412579576937ll;
ll add(ll x, ll y){return (1ull * x + 1ull * y) % mod;}
ll mul(ll x, ll y)
{
	ll sum = 0;
	while(y)
	{
		if(y & 1) sum = add(sum, x);
		y >>= 1, x = add(x, x);
	}
	return sum;
}
struct matrix
{
	vector<vector<ll> > a;
	matrix operator *(const matrix &c)const
	{
		matrix now;
		int n = a.size(), m = c.a.size(), l = c.a[0].size();
		now.a.resize(n);
		for (int i = 0; i < n; ++i) now.a[i].resize(l); 
		for (int i = 0; i < n; ++i)
		{
			for (int j = 0; j < l; ++j)
			{
				for (int k = 0; k < m; ++k)
				now.a[i][j] = add(now.a[i][j], mul(a[i][k], c.a[k][j]));
			}
		}
		return now;
	}
	matrix(){}
	matrix(int len1, int len2, int op = 1)
	{
		a.resize(len1);
		for (int i = 0; i < len1; ++i) a[i].resize(len2);
		if(op) for (int i = 0; i < len1; ++i) a[i][i] = 1;
	}
};
ll b, d, n;
matrix ksm(matrix x, ll y)
{
	matrix sum(2, 2);
	while(y)
	{
		if(y & 1) sum = sum * x;
		x = x * x, y >>= 1;
	}
	return sum;
}
int main()
{
	cin >> b >> d >> n;
	if(!n)
	{
		puts("1");
		return 0; 
	}
	matrix now(2, 2), a(1, 2);
	now.a[0][0] = b, now.a[1][0] = (d - b * b) / 4, now.a[0][1] = 1, now.a[1][1] = 0;
	a.a[0][0] = b, a.a[0][1] = 2;
	now = ksm(now, n - 1);
	a = a * now;
	if(b * b != d && n % 2 == 0) a.a[0][0]--;
	cout << a.a[0][0] << endl;
}

标签:JLOI2015,frac,matrix,int,题解,ll,字符串,now,sum
From: https://www.cnblogs.com/SFsaltyfish/p/18462829

相关文章

  • PTA C语言 7-1 字符串比对 单位 郑州轻工业大学输入两个长度相同的字符串,字符串长度小
    7-1字符串比对分数10作者 zzuli单位 郑州轻工业大学输入两个长度相同的字符串,字符串长度小于20,且只包含英文字符。将两个字符串逐字符对比的结果输出(由+和-构成的一行字符),具体规则如下:如果两个字符串对应字符是同一字母则输出+如果两个字符串对应字符不是同一字母......
  • Codeforces Round 899 (Div. 2)题解记录
    题目链接:https://codeforces.com/contest/1882A.IncreasingSequence从1开始慢慢和\(a[i]\)的所有值比较,注意最后一个位置特判下#include<iostream>#include<string.h>#include<map>#include<vector>#include<set>#include<unordered_set>#include<......
  • StringUtils Java字符串工具类
    在我们的代码中经常需要对字符串判空,截取字符串、转换大小写、分隔字符串、比较字符串、拼接字符串、使用正则表达式等等。如果只用String类提供的那些方法,我们需要手写大量的额外代码,不然容易出现各种异常。现在有个好消息是:org.apache.commons.lang3包下的StringUtils工......
  • 带余除法题解
    题面带余除法题目背景注意:提交至洛谷时,请使用标准输入输出,而非文件输入输出。NOTICE:WhensubmittingyourcodeonLuogusite,pleaseusestandardIOinsteadoffileIO.点我(或在本题底部)下载中文试题PDF。Clickhere(oratthebottomofthispage)todownload......
  • lazarus新的判断字符串是否为UTF8
    调用IsStringUTF8来判断string是否包含UTF8(中文);procedureTForm1.Button1Click(Sender:TObject);beginifIsStringUTF8(edit1.Text)thenmemo1.Lines.Add(s+'--包含中文')elsememo1.Lines.Add(s+'--包含不中文');end; functionIsStringUTF8(s......
  • Tarjan缩点题单 刷题题解
    Tarjan缩点可以将一个图的每个强连通分量缩成一个点,然后构建新图,该图就会变成一个有向无环图。变成有向无环图之后就能结合最短路,拓扑......解决相应题目洛谷题单分享:https://www.luogu.com.cn/training/526565前几道是绿题,没什么好写的,大致过一下1.强连通分量题目链接:https:......
  • 【算法题解记录】_1
    目录【算法题解记录】_1leetcode_115题【算法题解记录】_1还是干这个事了,要吃饭嘛,决定把在解题或者解完题进一步优化的时候,发现的有意思的地方记录一下leetcode_115题动态规划解的字符串匹配,矩阵全部都遍历,用时比较长,发现排在网友们的末尾纸上画了一下矩阵,行数代表被匹配串s......
  • 系统开发基础错题解析二【软考】
    目录前言1.人机界面设计2.架构设计2.1管道过滤器体系2.2仓库风格3.软件测试相关概念4.白盒测试用例4.14.25.测试分类与阶段任务划分6.软件维护类型7.软件质量保证8.软件过程改进前言本文专门用来记录本人在做软考中有关系统开发基础的错题,我始终认为教学相长是最快......
  • 数学题解报告
    TeamWork题意:求\(\sum_{i=1}^n\dbinom{n}{i}i^k\)\(n<=1e9,k<=5e3\)推式子\[\begin{aligned}记f_{n,k}&=\sum_{i=1}^n\dbinom{n}{i}i^k\\&=\sum_{i=1}^n\left[\dbinom{n-1}{i-1}+\dbinom{n-1}{i}\right]i^k\\&=\sum_{i=1}^n\d......
  • 神奇的幻方 NOIP 2015 题解
    描述幻方是一种很神奇的 N×N 矩阵:它由数字 1,2,3,⋯⋯,N×N 构成,且每行、每列及两条对角线上的数字之和都相同。当 N 为奇数时,我们可以通过下方法构建一个幻方:首先将 1 写在第一行的中间。之后,按如下方式从小到大依次填写每个数 K(K=2,3,⋯,N×N) :若 (K−1)......